C# UDP 一对多通信丢包或延时问题

Jasongrass 2015-11-28 01:47:17
====情境:====
一台电脑作为主机,向若干台设备轮询(因对每台设备发送的数据不完全一致,不能采用广播的形式),设备收到查询请求后,返回相应的数据给主机。

====拓扑结构:====

主机与设备之间用交换机连接。

====问题描述:====
当只有一台设备时,通信正常,实时性也很好。一台设备的情况如下:

当设备大于一台时(目前是两台),设备接收数据就会出现问题(丢包或者是严重的延时,具体是什么情况没有详测),
表面的感觉就是主机在一次轮询中,只与一台设备进行了通信。
如图:
下图显示的是 设备1-1 和 设备1-2 接收数据的情况,理想情况下,是 1-1 和 1-2 交替出现,即每次轮询(1秒1次)两者都返回了数据,但实际情况下,多数是 “一次轮询,只收到了其中一台设备的返回数据(说明另一台没有及时收到查询请求,所以没有返回)”。


====问题总结:====
主机发送了查询请求,但只有一台设备收到,另外的设备没有收到或没有及时收到。

求解决思路
谢谢各位
...全文
797 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jasongrass 2016-03-25
  • 打赏
  • 举报
回复
没有找到具体的问题原因,解决方法是采用广播形式发送消息。其实这是无奈之举。
mjp1234airen4385 2015-12-02
  • 打赏
  • 举报
回复
引用 14 楼 lj22377 的回复:
[quote=引用 12 楼 xuzuning 的回复:] 是你主机的接收代码有问题 当两个设备一起发包时,你没有及时接收到,或是收到了被丢弃了 这就是 UDP 不保证对方可以收到信息 的弊病 还有就是你的 主机轮询 是怎么设计的?
初步判断是 设备端的接收代码有问题,但没找到问题的根源。(自己用C语言写了个模拟设备的程序,跑在其它局域网内的机子上,完全没有问题。) 主机轮询,额,就是循环给每台设置发送查询指令的数据。 另外,发现一个奇怪的问题,在 ping 设备的 IP 地址的时候,会得到另一台设备的恢复,但显示无法访问: 感觉这个问题跟 不能同时跟两台设备进行通信有点关系。 [/quote] 如果不能ping通的话,那还是设备在链接协议上有限制了,不让多个设备在一个网里么?
zhh0000zhh 2015-12-01
  • 打赏
  • 举报
回复
最好能把源码发上来,不然很难定位错误
Jasongrass 2015-12-01
  • 打赏
  • 举报
回复
问题排查小结: 目前还是没有找到问题的根源。 不过可以肯定的是,不是发送端的问题, 可能是交换机转发,或者设备接收的问题。 表象就是:多台设备的时候,它们会“打架”。对于一个数据包,要么被正确接收, 要么丢包(可能被其它设备接收,然后因为目标地址不对丢弃,也可能是交换机转发的时候被丢弃,或者其它原因被丢弃,现在还不知道在哪里丢的包。)
asemarece 2015-12-01
  • 打赏
  • 举报
回复
你的这个项目需求用udp就是个悲剧。 建议选择tcp,估计会完美解决你的问题。
Poopaye 2015-11-30
  • 打赏
  • 举报
回复
引用 9 楼 lj22377 的回复:
设备那边的代码暂时不能动(时间有限,时间充裕的话就改TCP了)。
不能动就放弃吧
Jasongrass 2015-11-30
  • 打赏
  • 举报
回复
引用 13 楼 xomix 的回复:
不能广播的意思是什么,udp通讯完全用喊就好了,大家都扔到255去,然后根据信息内容判断是谁的信息领用一下就好了,这样能很大程度防止丢包。
额…… 不是不能,因为发给每台设备的数据都不一样。如果广播,会造成网络中数据拥堵吧。比如有 100 台设备,如果一次查询,就要发100个广播,每台设备都要处理这100个数据包,但其中只有一个是与之相关的,这…… 有点不合适。
Jasongrass 2015-11-30
  • 打赏
  • 举报
回复
引用 12 楼 xuzuning 的回复:
是你主机的接收代码有问题
当两个设备一起发包时,你没有及时接收到,或是收到了被丢弃了

这就是 UDP 不保证对方可以收到信息 的弊病

还有就是你的 主机轮询 是怎么设计的?


初步判断是 设备端的接收代码有问题,但没找到问题的根源。(自己用C语言写了个模拟设备的程序,跑在其它局域网内的机子上,完全没有问题。)
主机轮询,额,就是循环给每台设置发送查询指令的数据。
另外,发现一个奇怪的问题,在 ping 设备的 IP 地址的时候,会得到另一台设备的恢复,但显示无法访问:

感觉这个问题跟 不能同时跟两台设备进行通信有点关系。

  • 打赏
  • 举报
回复
不能广播的意思是什么,udp通讯完全用喊就好了,大家都扔到255去,然后根据信息内容判断是谁的信息领用一下就好了,这样能很大程度防止丢包。
xuzuning 2015-11-28
  • 打赏
  • 举报
回复
是你主机的接收代码有问题 当两个设备一起发包时,你没有及时接收到,或是收到了被丢弃了 这就是 UDP 不保证对方可以收到信息 的弊病 还有就是你的 主机轮询 是怎么设计的?
Jasongrass 2015-11-28
  • 打赏
  • 举报
回复
我开始怀疑是不是 设备那边的接收代码有问题,代码有类似“排他性”的问题存在……
Jasongrass 2015-11-28
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
如果你做了 udp 放丢包的设计,那么就可以说你的问题出自于程序设计本身。不是什么都靠猜的,但是你总要有个缩小范围的依据吧。
额…… 刚入门不久,不晓得如何在发送端做防UDP丢包的设计,因为每1秒都在查询,如果是采用重发机制没什么意义。 目前的情况是: 单台设备(无论是哪一台)的时候,没有任何问题。 两台一起连接到交换机上,就出现问题了(只有其中一台能收到)。
Jasongrass 2015-11-28
  • 打赏
  • 举报
回复
引用 6 楼 johnliuyuan 的回复:
建议在UDP之上再做个收发包的检测,确认一下收发包
额……没太懂。 设备那边的代码暂时不能动(时间有限,时间充裕的话就改TCP了)。 感觉问题的关键在于: 为什么单台设备(无论是哪一台)的时候,没有任何问题。两台一起连接到交换机上,就出现问题了。
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
如果你做了 udp 放丢包的设计,那么就可以说你的问题出自于程序设计本身。不是什么都靠猜的,但是你总要有个缩小范围的依据吧。
Jasongrass 2015-11-28
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
纠结这类“解决思路”其实意思不大。你根本就不应该采用 udp!
偶尔丢包是可以的,但目前的情况是,2个查询请求发出去,就有1个包丢了,这种丢包率难道是正常的? 至于为何选择UDP,我只能说,抱歉,设备限制。
john_QQ:2335298917 2015-11-28
  • 打赏
  • 举报
回复
建议在UDP之上再做个收发包的检测,确认一下收发包
  • 打赏
  • 举报
回复
纠结这类“解决思路”其实意思不大。你根本就不应该采用 udp!
  • 打赏
  • 举报
回复
说一千道一万,首先你是否明白 udp 是不可靠协议、根本不保证对方可以收到信息呢?你选择udp,那么就把你如何防止udp丢包的r措施写出来吧,然后再来看你的程序的问题。
Jasongrass 2015-11-28
  • 打赏
  • 举报
回复
发送与接收情况:

发出去了,但设备没有收到,也就没有返回……
加载更多回复(1)

110,533

社区成员

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

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

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