c# 用udp通信时,如果较长时间再Receive,会读到很早之前的旧数据吗?
也就是socket有没有把所有没读的数据,缓存在交换机。如果这个数据没有来读,下次来读,优先发这个旧的数据,是排队发的?
sockcet数据是按队列缓存在交换机吗
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- wanghui0380 2023-03-30 14:22关注
前面已经说了,udp无连接,非可靠。丢包,乱序正常
非广播组播的udp经过路由,路由会探测一下目标机器和端口在不在,在就发。不在就丢。(不在判定也不是很严格,就像前面那位说的,如果网络拥堵,探测包无回复,他就丢)
同样乱序也正常,路由转发时候探测的回复到达顺序不可知,A包比B包先到,探测包后到,那么他实际转发比B晚至于广播组播的,那种是在网络上乱窜的,TTL生存期到达之前他们会在网络上乱窜,所以接收顺序就更是拼人品的事情
然后把socket本身默认并不是断开就立刻断开的,端口其实还会默认保留一段时间,所以虽然你代码感觉断开了,但实际接收缓存实际还在继续接收
就像前面那位老兄说的,我们其实不靠程序判定,我们通过抓包程序判定,抓包程序是直接桥接在网卡驱动上的。所以网络上收到啥就是啥,如果你的抓包程序就是几分钟后收到的,那么他就真的是几分钟后收到的
ps:不过我奇怪的事情是,上个帖子已经说了。就你的项目而言1m就要来一次的东西,一个永不关闭的udpclient,一个永远异步接收就好。
有怎么存在“较长时间再Receive”的事情,我不关闭udpclient,他永远保留本地端口(因为你还有一个1m一探测的主动查询,所以路由器还不会主动断开死路由信息),所以只要路由转发过来了,你就立刻收到,根本就不存在“较长时间再Receive”这种事情本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 无线电能传输系统MATLAB仿真问题
- ¥50 如何用脚本实现输入法的热键设置
- ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
- ¥30 深度学习,前后端连接
- ¥15 孟德尔随机化结果不一致
- ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
- ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
- ¥15 谁有desed数据集呀
- ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
- ¥15 关于#hadoop#的问题