UDP多个客户端接收信息问题

weixin_43923132 2019-01-22 02:07:59
Socket实现的UDP服务器与客户端,当把多个客户端写在一个程序中的时候,可以正常的给服务端发送信息,服务端也能接收到。当服务器给客户端发送消息时,有的客户端就接收不到,例如:有10个客户端的时候,通常会有一到两个接收不到,重新启动服务端客户端后还是会出现这种情况。接收不到信息的客户端还不是固定的。
...全文
769 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sp1234_maJia 2019-01-22
  • 打赏
  • 举报
回复
引用 5 楼 weixin_43923132 的回复:
接收不到信息的那个端口,重发多次信息,还是会接收不到
UDP 不可能保证你重发就能收到,重发100万次也不能保证收到啊。 重发几次,就该抛出异常了。怎么能那么固执地非要看到 UDP 收到消息?
  • 打赏
  • 举报
回复
如果你是“对等网络”那么可能就是另外一回事儿了。比如说你的客户端其实也是服务器,消息接收端将返回值不是返回到客户端的消息发送端口,而是返回到客户端的服务器监听端口。那么这个时候你似乎可以使用 UDP 了。
  • 打赏
  • 举报
回复
所谓“UDP是不可靠的通讯”就是说它不受路由器“待见”,各种不同种类的路由器也许能支持它40%,也许连10%都不支持它,不保证它的通讯。相比之下,路由器只保证 TCP 通讯。
  • 打赏
  • 举报
回复
任何通讯,本来就应该由客户端发起访问。关键的区别在于这个之后的通讯行为。TCP 和 UDP 有天壤之别,UDP 的不合规 NAT 访问本来就被阻拦。所以不要乱用什么不靠谱的“UDP打洞”概念,多用 TCP 的靠谱的双向通讯机制。
weixin_43923132 2019-01-22
  • 打赏
  • 举报
回复
重新启动服务端,客户端之后,上图的9001端口就有可能会接收到信息,但是其他的端口又有可能会接收不到。如果客户端接收不到信息,重复发送还是接收不到。
  • 打赏
  • 举报
回复
另外,UDP 不支持流式长连接。任何通讯本来就应该是由客户端发起连接。对于 TCP 这类,那么一旦建立起来,在断开之前,那么服务器可以随时推送消息给客户端,路由器支持长连接NAT机制。但是假设A跟B进行了 UDP 通讯,那么路由器只在很短促的时间内维持 B 对 A 的 NAT 转换,这个窗口期时间一过就不可能在从 B 访问 A 了。因为对于路由器来说,UDP 通讯协议是流氓,TCP 通讯协议才是君子。
weixin_43923132 2019-01-22
  • 打赏
  • 举报
回复
接收不到信息的那个端口,重发多次信息,还是会接收不到
wanghui0380 2019-01-22
  • 打赏
  • 举报
回复
udp收不消息是一件相当正常的事情,udp本身就是只管发不管收的机制。

所以一般使用udp的,如果需要保证消息的,请自己做消息确认和重发,超时等机制

如果不需要保证消息的,一般是连发3-5次,多发几次尽量覆盖,如果实在覆盖不到也没办法,反正原本就是不保证消息的要求
  • 打赏
  • 举报
回复
udp本来就是不可靠的。网络中,一旦通过路由器中转通讯,特别是多个路由器,有多一半消息都收不到,这也是“正常”的。
皂皂丶 2019-01-22
  • 打赏
  • 举报
回复
抓包看下服务有没有全都发出去,然后如果都发了,客户端查问题,反之服务端查问题
weixin_43923132 2019-01-22
  • 打赏
  • 举报
回复
希望各位大神帮帮忙!谢谢啊!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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