求助vb winsock通信达人
我在用vb6做一个通信程序,是服务器与客户端的,服务器用两个winsock控件监听,客户端每次连接服务器都发送两个请求(就是说服务器与客户端之间同时有两路通道),服务器收...
我在用vb6做一个通信程序,是服务器与客户端的,服务器用两个winsock控件监听,客户端每次连接服务器都发送两个请求(就是说服务器与客户端之间同时有两路通道),服务器收到连接请求后再用两个winsock数组控件响应客户端。现在的问题是,只有一个客户端连接时可以正常,但是客户端一旦断开后再连接就出现“地址正在使用”的错误。我尝试过只用一个通道,可以使用,但是两个通道就不行,以前没用过winsock,不清楚是不是两路通道就不行。
由于字数限制,我只能附上部分主要代码:
Private Sub Winsock02_ConnectionRequest(ByVal requestID As Long) '发生客户端请求时触发
Dim i As Integer
'决定由哪一Winsock接受请求
For i = 0 To 19
If WinsockGroup02(i).State = 0 Then
Exit For
End If
Next i
If ServerFlag <> 3 Then Exit Sub
If WinsockGroup02(i).State = 0 Then
WinsockGroup02(i).Accept requestID
End If
Exit Sub
End Sub
Private Sub Winsock03_ConnectionRequest(ByVal requestID As Long) '发生客户端请求时触发
Dim i As Integer
'决定由哪一Winsock接受请求
For i = 0 To 19
If WinsockGroup03(i).State = 0 Then
Exit For
End If
Next i
If ServerFlag <> 3 Then Exit Sub
If WinsockGroup03(i).State = 0 Then
WinsockGroup03(i).Accept requestID
End If
Exit Sub
End Sub
Private Sub Winsock02_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox Description, vbExclamation, "连接提示"
Err.Clear
End Sub
真心求助了解这个达人,再次先谢过了……
lhr0216@qq.com 展开
由于字数限制,我只能附上部分主要代码:
Private Sub Winsock02_ConnectionRequest(ByVal requestID As Long) '发生客户端请求时触发
Dim i As Integer
'决定由哪一Winsock接受请求
For i = 0 To 19
If WinsockGroup02(i).State = 0 Then
Exit For
End If
Next i
If ServerFlag <> 3 Then Exit Sub
If WinsockGroup02(i).State = 0 Then
WinsockGroup02(i).Accept requestID
End If
Exit Sub
End Sub
Private Sub Winsock03_ConnectionRequest(ByVal requestID As Long) '发生客户端请求时触发
Dim i As Integer
'决定由哪一Winsock接受请求
For i = 0 To 19
If WinsockGroup03(i).State = 0 Then
Exit For
End If
Next i
If ServerFlag <> 3 Then Exit Sub
If WinsockGroup03(i).State = 0 Then
WinsockGroup03(i).Accept requestID
End If
Exit Sub
End Sub
Private Sub Winsock02_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox Description, vbExclamation, "连接提示"
Err.Clear
End Sub
真心求助了解这个达人,再次先谢过了……
lhr0216@qq.com 展开
3个回答
展开全部
winocks连接有2种协议,你有服务器、客户端应该采用的是tcp协议。以前写过类似的软件。多链路想法不错但vb不能多线程处理问题而且不够稳定。我想你的问题可能是单服务器多客户机,可以考虑2点:
1、服务器判断某一个客户机一旦失去链接马上初始化先前连接的端口
2、服务器、客户机先约定特定范围内的端口,可以有很多端口(定数量的winsock可以动态开端口,也可以动态建立很多指定端口的winsock控件,前者效率更高,缺点就是端口数量不多),当客户机连接时根据返回的结果动态选取约定的端口进行的链接,这样一般情况下成功率会很高。
链接问题解决了以后剩下的问题当然是服务器判断是那台机子链接在哪个端口的事了,这个问题很好解决,当第一次链接成功时客户机可以发个IP给服务器并记录此时的端口号。
1、服务器判断某一个客户机一旦失去链接马上初始化先前连接的端口
2、服务器、客户机先约定特定范围内的端口,可以有很多端口(定数量的winsock可以动态开端口,也可以动态建立很多指定端口的winsock控件,前者效率更高,缺点就是端口数量不多),当客户机连接时根据返回的结果动态选取约定的端口进行的链接,这样一般情况下成功率会很高。
链接问题解决了以后剩下的问题当然是服务器判断是那台机子链接在哪个端口的事了,这个问题很好解决,当第一次链接成功时客户机可以发个IP给服务器并记录此时的端口号。
展开全部
如果要开启2路进行侦听的话,winsock的本地IP和端口号必须有一个不相同,否则就会出现这种情况。
追问
本地地址是相同的,端口是相邻的两个。
Winsock02.RemoteHost = Trim(TargetIp.Text) '服务器IP
Winsock02.RemotePort = Trim(TargetPort.Text) '服务器端口
Winsock03.RemoteHost = Trim(TargetIp.Text) '服务器IP
Winsock03.RemotePort = Trim(TargetPort.Text) + 2 '服务器端口
不知道你还有建议吗?谢谢……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用完之后要关闭端口啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询