在很多winsock聊天例程中,在服务端收到对方联接请求时,都会做如下命令Private Sub winsock1_ConnectionRequest(ByVal requestID As Long)
       If winsock1.State <> 0 Then winsock1.Close
       winsock1.Accept requestID
为何在收到对方联接请求时,反而要把自己的winsock关闭呢,这样理论上好象是说不通,但实际我试了一下,在服务端winsock关闭的情况下,client端通过senddate又是可以传送数据的。
我还发现这些例程都有一个同样的问题,我只要用superscan一扫描一下服务端的监听端口,服务器都会down掉。这样的话,那不是很容易被人家攻击!!??请哪位老大,能解决我的困惑?

解决方案 »

  1.   

    Q:为何在收到对方联接请求时,反而要把自己的winsock关闭呢,这样理论上好象是说不通,但实际我试了一下,在服务端winsock关闭的情况下,client端通过senddate又是可以传送数据的。
    A:
    socket从监听状态转变为连接状态时,必须先关闭然后再转变 所以要用到
    If winsock1.State <> 0 Then winsock1.CloseQ:我还发现这些例程都有一个同样的问题,我只要用superscan一扫描一下服务端的监听端口,服务器都会down掉。这样的话,那不是很容易被人家攻击!!??A:这多半是因为检错控制机制不完善造成的,不是sock的问题
      

  2.   

    Private Sub Winsockserver_Close(Index As Integer)
        On Error Resume Next
        Winsockserver(Index).Close        '释放接连
        Unload Winsockserver(Index)       '删除控件
        CurNumber = CurNumber - 1
        End Sub
    Private Sub Winsockserver_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    On Error Resume Next If CurNumber < 1000 Then '1000为最大连接数,CurNumber为当前连接数
        For inum = 1 To CurNumber
          If winsockKJ(inum) = False Then      '判断是否有空闲Winsock控件
              Load Winsockserver(inum)        '创建与主站连接Winsock数组
                   Winsockserver(inum).Accept requestID
                   CurNumber = CurNumber + 1
            Exit For
           End If
         Next inum
       End If
    End Sub
      

  3.   

    为什么要关闭,是因为已经建立了连接,该端口已经被占用,因此要关闭套接字,相当于是接受客户连接的意思。
       你可以试一下不.close,就可能会发生错误。
       使用superScan不会导致当机的,除非你的机器有问题,或者程序里有崩溃性错误。
       连接成功后,.close是必需的。相当于是一个规则。