在很多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掉。这样的话,那不是很容易被人家攻击!!??请哪位老大,能解决我的困惑?
If winsock1.State <> 0 Then winsock1.Close
winsock1.Accept requestID
为何在收到对方联接请求时,反而要把自己的winsock关闭呢,这样理论上好象是说不通,但实际我试了一下,在服务端winsock关闭的情况下,client端通过senddate又是可以传送数据的。
我还发现这些例程都有一个同样的问题,我只要用superscan一扫描一下服务端的监听端口,服务器都会down掉。这样的话,那不是很容易被人家攻击!!??请哪位老大,能解决我的困惑?
A:
socket从监听状态转变为连接状态时,必须先关闭然后再转变 所以要用到
If winsock1.State <> 0 Then winsock1.CloseQ:我还发现这些例程都有一个同样的问题,我只要用superscan一扫描一下服务端的监听端口,服务器都会down掉。这样的话,那不是很容易被人家攻击!!??A:这多半是因为检错控制机制不完善造成的,不是sock的问题
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
你可以试一下不.close,就可能会发生错误。
使用superScan不会导致当机的,除非你的机器有问题,或者程序里有崩溃性错误。
连接成功后,.close是必需的。相当于是一个规则。