100分,UDP的问题?

jaffy 2005-05-12 05:32:49
被这个现象搞的郁闷了几天了!
现在有个服务端需要与多个客户端进行通信
采用的是UDP协议
服务端中有两个SOCKET控件,一个负责监听,另一个负责发送
并且记录下每个连接的远程IP(REMOTEHOST)和远程端口(REMOTEPORT)

客户端则指定服务端的IP和端口.并且将服务器回传的应答显示

我在本地调试一点问题也没有,各个客户端发送和接受都正常.

放到外网服务器上面问题就来了,客户端的数据可以到服务器,但服务器的应答到不了客户端;

后来改成一个SOCKET负责监听和发送,连接一个客户端还可以,多个就又不行了,服务器的数据老是回到第一个连接的客户端上面.

我就觉得奇怪了,为什么在本地挺好的,上了外网就不行了呢?


...全文
121 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Begin2008 2005-05-19
  • 打赏
  • 举报
回复
mark
jadeluo 2005-05-13
  • 打赏
  • 举报
回复
楼主的问题是出在"服务端中有两个SOCKET控件,一个负责监听,另一个负责发送",改成一个SOCKET就不会出现楼主所描述的问题了。
zyg0 2005-05-13
  • 打赏
  • 举报
回复
我估计你服务器发送是这样的


Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim str As String

Winsock1.GetData str, vbString

winsock1.senddate str
End Sub

udp必须改成这样就好了
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim str As String

Winsock1.GetData str, vbString
Winsock1.RemoteHost = ip
Winsock1.RemotePort = 端口
winsock1.senddate str
End Sub
jadeluo 2005-05-12
  • 打赏
  • 举报
回复
如jlum99(闲人)所言,问题出在你的内网访问外网的网关上。

解释如下:

1. 只在内网中使用时的情况

Step 1: 客户端的UDP Socket --> 发送数据 --> 服务器端负责接收的UDP Socket
Step 2: 服务器端负责发送的UDP Socket --> 发送数据 --> 客户端的UDP Socket


2. 在外网上使用时的情况

Step 1: 客户端的UDP Socket --> 发送数据 --> 网关
Step 2: 网关NAT --> 发送数据 --> 服务器端负责接收的UDP Socket
Step 3: 服务器端负责发送的UDP Socket --> 发送数据 --> 网关

问题就出在Step3这一步中服务器返回数据所使用的UDP Socket(服务器端负责发送的UDP Socket)已经不是Step2时网关NAT发送数据到的那个UDP Socket(服务器端负责接收的UDP Socket),这将导致网关认为这个UDP Socket是不可信任的(服务器端负责发送的UDP Socket),网关将丢弃从这个UDP Socket发送来的所有数据。
TBNTB 2005-05-12
  • 打赏
  • 举报
回复
學習一下﹐幫頂
jlum99 2005-05-12
  • 打赏
  • 举报
回复
"客户端的数据可以到服务器,但服务器的应答到不了客户端;"

这个是因为服务器端的数据包在客户端被路由丢弃了.

"服务器的数据老是回到第一个连接的客户端上面."

每次发送的时候试试出始化你的winsock控件



zyg0 2005-05-12
  • 打赏
  • 举报
回复
你把发送那段代码贴出来,就改一个地方就好了,就是服务器往客户端发送哪块

1,502

社区成员

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

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