这是UDP协议的丢包吗?丢的这么厉害?

screen12 2016-05-28 02:44:52
我用UDP协议把一个1M的文件从服务器传送到客户端。我把它分成2000个大小为500字节左右的小包。在服务器端用for循环发送。然后客户端用for循环接收。

服务器端的udp套接字为非阻塞方式,接收端的udp套接字为阻塞方式。

同时我把服务器和客户端的发送缓冲区和接收缓冲区大小均设为10M以上。

经调试发现:服务器那里,2000个包一个就发完了,没有发生错误。

可是接收端,却一直停在接收循环里,进一步测试发现,收到400多个包,就收不到了。就停在循环里的recvfrom语句里(阻塞方式)。

查看已经收到的400多个包,从序号上看,序号从1到260,还有600多到700多,序号超过1000的只有一个包。

我想问的是:这是丢包造成的吗?如果是,那为什么丢包这么严重?丢了百分之七八十啊!

如果不是,那是什么原因造成的?
...全文
267 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
draculacsdn 2016-05-31
  • 打赏
  • 举报
回复
异步收,接收后放在缓存中,先不处理,都收完后再处理;
Yofoo 2016-05-30
  • 打赏
  • 举报
回复
TCP在缓冲满的时候会反馈信息到发送方告诉他缓冲满了, UDP是没有这个机制的, 主要问题是接受方的缓冲, 也就是客户端的接受缓冲大小问题
shenyi0106 2016-05-30
  • 打赏
  • 举报
回复
发生这个问题的主要原因是,你软件的发送速度大于硬件缓冲区(当时的时刻)的大小,导致数据包被协议栈丢弃了。 丢包其实是发生在IP层(也就是网络层),因为TCP在四层上有滑动窗口和重传机制,所以TCP可以保证数据的完整性。 但是UDP在四层上没有这个机制,三层把数据丢了,那就是真丢了。 既然你都用到了异步发送,那么为什么不改进一下,接收(或者查询一下)发送完成消息呢?
bluesen 2016-05-29
  • 打赏
  • 举报
回复
为什么不用堵塞方式发送?正确的方式是先用select()判断可以发送,然后send()
一步一光年 2016-05-28
  • 打赏
  • 举报
回复
开个线程处理
screen12 2016-05-28
  • 打赏
  • 举报
回复
又试验了一下,在服务器发送的时候,每发一个包,sleep一毫秒。然后就没问题了。客户端全部收到了。 那就是服务器端发送太快所致了?可是我服务器端的发送缓冲区已经设为10M了,它不是发送到缓冲区里的吗?文件只有1M,2000个500字节大小的包,缓冲区容纳得下吧? 可是用sleep来延缓发送,会造成服务器效率不高。有什么好的办法解决吗?

18,356

社区成员

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

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