【求助】【WINSOCK】客户端断开后,服务端如何正确快速地关闭被占用的端口?
小弟昨天开始研究WINSOCK控件的使用,到社区翻了不少相关的帖子,但是这个疑问却还没能够解决
现在程序都是在本地测试,分成服务端和客户端两部分
客户端较为简单:(只使用一个WINSOCK控件)
Me.WinSock.RemoteHost = "localhost"
Me.WinSock.RemotePort = 5000
Me.WinSock.LocalPort = 5001
Me.WinSock.Connect
要求是打开使用5001端口,然后连接本地的5000端口(服务端)
服务端使用了2个WINSOCK控件数组
WinSock() 用于监听端口
WinSockArray() 用于接收数据
基本代码如下:
Dim SocketList As Integer
Private Sub Form_Load()
' 初始化
Me.WinSock(0).LocalPort = 5000
Me.WinSock(0).Listen
SocketList = 1
End Sub
' 收到连接请求
Private Sub WinSock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
' 新建WinSockArray用于接收数据
Load Me.WinSockArray(SocketList)
Me.WinSockArray(SocketList).Accept requestID
SocketList = SocketList + 1
' 重启监听用WinSock
Me.WinSock(Index).Close
Me.WinSock(Index).Listen
DoEvents
End Sub
' 收到数据包
Private Sub WinSockArray_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim mydata As String: mydata = ""
Me.WinSockArray(Index).GetData mydata
' 数据处理部分
DoEvents
End Sub
' 收到关闭请求
Private Sub WinSockArray_Close(Index As Integer)
If Me.WinSockArray(Index).State <> sckClosed Then
Me.WinSockArray(Index).Close
End If
End Sub
首先开启服务端,然后开启客户端
这时候可以非常顺利的发送数据(多次也可以)
之后关闭客户端再重新开启
就会发生错误:"10048,地址正在被使用"
在Console下使用netstat命令下查看
也会看到"TCP 127.0.0.1:5001 127.0.0.1:5000 TIME_WAIT"
在社区里找到的帖子上说要在"Sub WinSockArray_Close"中正确的关闭连接
但是还没有找到有明确的代码说明如何才是正确的关闭
请各位对此有研究的前辈看一下小弟的代码
如果能给出解决方法那就更好了
先谢过 ^_^