为什么winsock的udp服务端只给第一个接入的客户端回应?

yang131105 2008-11-19 11:50:07
服务端:
Private Sub Form_Load()
Winsock1.Protocol = sckUDPProtocol
Winsock1.LocalPort = 1111
Winsock1.Bind 1111
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim aaa As String
Winsock1.GetData aaa
Winsock1.SendData aaa & " resend"
End Sub
客户端1:
Private Sub Form_Load()
Winsock1.Protocol = sckUDPProtocol
Winsock1.RemoteHost = "服务端ip"
Winsock1.RemotePort = 1111
Winsock1.LocalPort = 1112
End Sub

Private Sub Command1_Click()
Winsock1.SendData Text2.Text
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim aaa As String
Winsock1.GetData aaa
Text1.Text = aaa
End Sub
客户端2:
Private Sub Form_Load()
Winsock1.Protocol = sckUDPProtocol
Winsock1.RemoteHost = "服务端ip"
Winsock1.RemotePort = 1111
Winsock1.LocalPort = 1113
End Sub

Private Sub Command1_Click()
Winsock1.SendData Text2.Text
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim aaa As String
Winsock1.GetData aaa
Text1.Text = aaa
End Sub
也就是说两个客户端除了端口不同,哪都一样。运行服务端,然后分别启动客户端,先点客户端1的按钮,马上客户端1收到服务端的回应。然后点客户端2的按钮,客户端1却再次收到回应.客户端2没有收到服务端的回应。这是为什么?后来在服务端上加了1个文本框,在winsock1.senddata之前加了一句text1.text=Winsock1.RemoteHost & Winsock1.RemotePort。再次试验时点客户端2时服务端确实显示的是客户端2的ip和端口.但数据却发给了客户端1.也就是说winsock的udp只能给一个ip及端口组合发送数据,一旦发送了就像绑定上了一样,只给它一个发。除了在服务端建立winsock数组外,能解决这个问题么?期待高手解决。
...全文
130 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yang131105 2008-11-26
  • 打赏
  • 举报
回复
SupermanKing 正解!问题解决。
qap22 2008-11-21
  • 打赏
  • 举报
回复
ding
现在还是人类 2008-11-21
  • 打赏
  • 举报
回复

'服务端
Private Sub Form_Load()
Winsock1.Protocol = sckUDPProtocol
Winsock1.Bind 1111
Form2.Show
Form3.Show
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim GetInfo As String
Dim rIP As String, rPort As Integer
Winsock1.GetData GetInfo, vbString, bytesTotal

'这里是关键,当读取属性后地址就会改变
rIP = Winsock1.RemoteHostIP
rPort = Winsock1.RemotePort
'这里是重新设置地址
Winsock1.RemoteHost = rIP
Winsock1.RemotePort = rPort

Winsock1.SendData GetInfo & " Return"
End Sub


'客户端1
Private Sub Command1_Click()
Winsock1.RemoteHost = "127.0.0.1"
Winsock1.RemotePort = 1111
Winsock1.SendData "客户端1"
End Sub

Private Sub Form_Load()
Winsock1.Protocol = sckUDPProtocol
Winsock1.Bind 1112
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim GetInfo As String
Winsock1.GetData GetInfo, vbString, bytesTotal
MsgBox "客户端1收到:" & GetInfo
End Sub


'客户端2
Private Sub Command1_Click()
Winsock1.RemoteHost = "127.0.0.1"
Winsock1.RemotePort = 1111
Winsock1.SendData "客户端2"
End Sub

Private Sub Form_Load()
Winsock1.Protocol = sckUDPProtocol
Winsock1.Bind 1113
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim GetInfo As String
Winsock1.GetData GetInfo, vbString, bytesTotal
MsgBox "客户端2收到:" & GetInfo
End Sub
yang131105 2008-11-20
  • 打赏
  • 举报
回复
谢谢,楼上的回答,不过这不能改变什么,因为在客户端2点击时Winsock1.RemoteHost 和 Winsock1.RemotePort 里的值就是客户端2的值。可回应依然发到客户端1上。为了以防万一,我照楼上的做了一下,问题依旧。
难道没人知道这是为什么么?请高手赐教。希望大家回答前先自己试一下。
现在还是人类 2008-11-20
  • 打赏
  • 举报
回复
你这样看看

服务端:
Private Sub Form_Load()
Winsock1.Protocol = sckUDPProtocol
Winsock1.LocalPort = 1111
Winsock1.Bind 1111
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim aaa As String
Winsock1.GetData aaa, vbString, bytesTotal
Winsock1.RemoteHost = Winsock1.RemoteHost
Winsock1.RemotePort = Winsock1.RemotePort
Winsock1.SendData aaa & " resend"
End Sub

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧