UDP协议丢包

lidatou 2012-09-20 04:55:40
我看网上有人写(UDP只能保证你一件事,那就是包的完整性。你如果发一个256bytes的包,那么对方收到的肯定也是一个256bytes的包。他不会只收到半个包之类的。当然这其实也是UDP唯一能保证你的事情。其他事情都要靠你自己去订制。) 这个地方不是太理解他说的包。 这个包指的是我发送的数据还是UDP封装的包,比如我用SendTo函数发送了一个字符串,那么这个字符串是一个包呢,还是这个字符串会被分为几个包。
...全文
207 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lidatou 2012-09-21
  • 打赏
  • 举报
回复
谢谢各位,分平均分给你们!
kyotrue 2012-09-21
  • 打赏
  • 举报
回复
SendTo发送出去的数据,加上底层协议栈给你加的包头,就是一个包,UDP协议栈保证收上来的是一个完整的包,和发送出来的东西一样的,有问题的包给你过滤掉。
youngwolf 2012-09-21
  • 打赏
  • 举报
回复
你调用一次sendto,就是一个包,哪怕这个包只有一个字节,当包长超过最大长度时,我记得是发送失败的,此时你要自己分包,这是非常好理解的,假如你有一个文件要发送,你总不至于一个包发一个文件吧,肯定要自己分包。

你收到的包,都可以认为是正确的,完整的。tcp的话,收到的数据可以认为是正确的,但完整性保证不了。
lidatou 2012-09-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

UDP只是"尽最大努力"把数据发给对方,是无连接的,不保证数据的可靠,顺序交付,也没有流量控制.应用程序每次调用sendto,在UDP协议都是一个数据包,如果数据的长度超过协议规定的最大值,在Windows上65507,sendto会失败.
你可以参考《WinSock网络编程经络》第4章,有详细的解释,这里有UDP程序源码,解压后找Daytime文件夹,下载地址:http://download……
[/Quote]
用sendto,在UDP协议都是一个数据包,如果数据的长度超过协议规定的最大值,在Windows上65507,这句话的意思是不是我如果发送65507大小的数据,对方要么都收到要么都收不到,不会收到一部分。
lidatou 2012-09-21
  • 打赏
  • 举报
回复
这个我知道,我就是搞不清楚哪个地方是我编程需要注意的。 UDP只能保证你一件事,那就是包的完整性,这句话所说的包是不是你说的(之后操作系统底层会为你组装成一个UDP数据包)UDP数据包。 如果是也就是说我发送一个长字符串可能会被分成2个包发,对方要么收到1或2个包,要么没收到,不会说收到一个包的一半吧?
Geoff08Zhang 2012-09-21
  • 打赏
  • 举报
回复
UDP只是"尽最大努力"把数据发给对方,是无连接的,不保证数据的可靠,顺序交付,也没有流量控制.应用程序每次调用sendto,在UDP协议都是一个数据包,如果数据的长度超过协议规定的最大值,在Windows上65507,sendto会失败.
你可以参考《WinSock网络编程经络》第4章,有详细的解释,这里有UDP程序源码,解压后找Daytime文件夹,下载地址:http://download.csdn.net/detail/geoff08zhang/4571358
Gloveing 2012-09-20
  • 打赏
  • 举报
回复
你得去理解TCP/UDP,理解数据时怎么发送出去的
你使用UDP,调用SendTo函数发送了一个字符串,
---》之后操作系统底层会为你组装成一个UDP数据包
---》之后再组装成IP数据包
---》组装成MAC数据帧 -》发送出去
接收端又“一层层”的把mac帧头,IP包头“剥掉”,最终还原出真正数据

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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