当前位置: 技术问答>linux和unix
UDP数据掉失
来源: 互联网 发布时间:2016-07-23
本文导语: 想问一下,我写了个简单的UDP程序,发现发送一个大点的文件时会掉包 更加可恶的是两机计算机发文件的时候就连不上了,发几个字符串却没有问题 有人告诉一下是什么原因吗? | udp包的...
想问一下,我写了个简单的UDP程序,发现发送一个大点的文件时会掉包
更加可恶的是两机计算机发文件的时候就连不上了,发几个字符串却没有问题
有人告诉一下是什么原因吗?
更加可恶的是两机计算机发文件的时候就连不上了,发几个字符串却没有问题
有人告诉一下是什么原因吗?
|
udp包的最大数据长度是64k.
因为udp是不可靠的协议, 接收的时候,是按包接收,而这个包,是driver 发的包,
如果你发的包大于driver 的buffer, 那它会自动分包,如果你 有一个收不到,你就不知道是那个了。
特别是在internet 的状况下 ,丢包机会会更大,建议使用TCP吧,否则处理起来比较麻烦。
因为udp是不可靠的协议, 接收的时候,是按包接收,而这个包,是driver 发的包,
如果你发的包大于driver 的buffer, 那它会自动分包,如果你 有一个收不到,你就不知道是那个了。
特别是在internet 的状况下 ,丢包机会会更大,建议使用TCP吧,否则处理起来比较麻烦。
|
你发送文件应该也是将文件中的内容读出来,在分别发送出去吧,这和发字符串没有区别。
连接不上应该是你的代码问题, UDP 是不可靠的协议,所在在传输文件的时候需要考虑传输的可靠性。
|
如果你在你的局域网上都能明显的看出来udp的传输不可靠,就完全是程序写的问题
可以把你程序贴出来看看
可以把你程序贴出来看看
|
都是因为你发文件内容比较大的时候, 你的机器会一直不停的发送数据到另一台机,这就有两种情况,一个是你的发送缓冲区速度的被填满,这个你可以通过判断sendto的返回值得到结果. 另一方面也可能是你目标机的接收缓冲区被速度填满, 这对UDP来说就没程序内部没有法子判断. 最后一种情况不是中间网络的传输性能跟不上, 根本无法快速的交互你发出的数据包. 后两种情况都会导致你ping不通接收机.
而你发送几个小字符串的时候不会存在这个问题.
一般来说一个数据包的总长度不要超过1500字节,因为ethernet的MTU一般就是1500字节, 大于这个的包在中间传输过程中都会被分片.
而你发送几个小字符串的时候不会存在这个问题.
一般来说一个数据包的总长度不要超过1500字节,因为ethernet的MTU一般就是1500字节, 大于这个的包在中间传输过程中都会被分片.