UDP接收数据的完整性判断

时间:2022-03-13 04:00:38
采用UDP接收大块数据:

我先在发送端将数据拆分为带序号的1KB大小的若干小单元,然后在while中分次发送出去,每次发送10次(共10K)。

在接收端可能无法完整接受到10K中的全部数据包,我的问题是,怎么判断接收全部完成,何时设置超时(因为不同客户端网速差别可能很大)?

10 个解决方案

#1


分组与打包,每个包都有包编号,针对某个包丢失的场合,要通知对方重发,还有注意避免由于重发->丢失->再重发->再丢失->再再...丢失而引起数据阻塞的问题
一般而言,TCP在这方面做得很好,我们可以直接使用TCP而不必关心这些问题了不得,建议你去参考TCP的相关内容

#2


谢谢你的回复,由于我在做一个视频聊天模块,里面用到了打洞,所以是UDP的,不过你说的“重发->丢失->再重发->再丢失->再再...”确实可能出现,谢谢提醒!

#3


判断完整性主要是为了传文件

#4


每个包一个序号,接收端,可根据序号来判断

#5


自己定义好协议 

#6


我以前做过,一 种按顺序插,每次读取指定长度的字节,然后发送,然后等待服务端确认,主要确认接受的大小,返回包,如果返回成功,继续下一个,如果没返回,继续发上次包, 最后一次发送文件尾
还有种就是带序号,开很多线程一起发,服务端创建同样大小的空数据,根据收到的包数据和序号,对应序号插进去,最后接收完,数据也是完整的 

#7


10k 大小应该不需要分包才对 

udp一般支持最大64k数据

如果要分包的话 把每包标上序号 做一个acker 收到一包再发下一包 一直到收完

但是个人觉得大的包应该用tcp传输

#8


可以参考TCP协议的原理来进行。呵呵

#9


mark下,这个问题从未深思过

#10


ls的都已经说了,这个需要自己定义协议,定义包头,加个序列号,如果对方未收到,就需要重发该包,和TCP的比较类似。。。

#1


分组与打包,每个包都有包编号,针对某个包丢失的场合,要通知对方重发,还有注意避免由于重发->丢失->再重发->再丢失->再再...丢失而引起数据阻塞的问题
一般而言,TCP在这方面做得很好,我们可以直接使用TCP而不必关心这些问题了不得,建议你去参考TCP的相关内容

#2


谢谢你的回复,由于我在做一个视频聊天模块,里面用到了打洞,所以是UDP的,不过你说的“重发->丢失->再重发->再丢失->再再...”确实可能出现,谢谢提醒!

#3


判断完整性主要是为了传文件

#4


每个包一个序号,接收端,可根据序号来判断

#5


自己定义好协议 

#6


我以前做过,一 种按顺序插,每次读取指定长度的字节,然后发送,然后等待服务端确认,主要确认接受的大小,返回包,如果返回成功,继续下一个,如果没返回,继续发上次包, 最后一次发送文件尾
还有种就是带序号,开很多线程一起发,服务端创建同样大小的空数据,根据收到的包数据和序号,对应序号插进去,最后接收完,数据也是完整的 

#7


10k 大小应该不需要分包才对 

udp一般支持最大64k数据

如果要分包的话 把每包标上序号 做一个acker 收到一包再发下一包 一直到收完

但是个人觉得大的包应该用tcp传输

#8


可以参考TCP协议的原理来进行。呵呵

#9


mark下,这个问题从未深思过

#10


ls的都已经说了,这个需要自己定义协议,定义包头,加个序列号,如果对方未收到,就需要重发该包,和TCP的比较类似。。。