关于udp服务器的设计

一个程序员的修炼之路 2010-11-20 02:00:46


问题之一丢包连接:http://topic.csdn.net/u/20101114/16/d7ecdb41-f516-41bc-8f91-9f4cbf9a340c.html

但后来发现 局域网带宽已经充足,就算丢包也不会那么严重;后来发现了一个问题。

我先来说下我的udp服务器:
一个socket A专门用来建立"连接",当有客户端请求,
新建一个socket专门用来和相应客户端通信;


问题:如果不用udp服务器,而是单纯的发送和接收udp数据包,丢包率基本为0;
但用了我所设计的udp服务器后,丢包率相当严重?

欢迎大家讨论
...全文
223 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hurryboylqs 2010-12-18
  • 打赏
  • 举报
回复
看你怎么收包
是不是收包不及时导致的,收包后放到队列让其他线程处理继续收
peergine 2010-11-20
  • 打赏
  • 举报
回复
呵呵,这是讨论,不是争论,不存在和解说法:)
evan_entelechy 2010-11-20
  • 打赏
  • 举报
回复
这个不是和了解啊
  • 打赏
  • 举报
回复
但我感觉你的结论是不正确的;
因为我测试了,当客户端发送了第一个包给(socketA)的后,sleep(5000),
而此时 服务器端肯定接收到了第一个包,但之后的丢包率 却还是比情况1高?

再次感谢你 认真的解答



peergine 2010-11-20
  • 打赏
  • 举报
回复
我测试了 所丢的包并非 初始的包 而是后来的某些包

答: 最开始的包会缓存在缓冲区里,反而不会丢.而是缓冲区满了,还没来得及收,紧跟着后面的一些包丢了.然后开始收了,情况又好了.

建议实现个可靠的通信的吧,不可靠的机制,实用性不大.
  • 打赏
  • 举报
回复
你点击 论坛->页面左边"我的社区"->个人资料 里面有的
peergine 2010-11-20
  • 打赏
  • 举报
回复
各位: 我怎么设置呢称啊? 好像改不了! 我刚刚注册, 不会用这个系统.
  • 打赏
  • 举报
回复
还有就是 在用socketB接收之前 我也将socketA关闭了
peergine 2010-11-20
  • 打赏
  • 举报
回复
具体要看这两个socket是怎么控制的.
  • 打赏
  • 举报
回复
我测试了 所丢的包并非 初始的包 而是后来的某些包
peergine 2010-11-20
  • 打赏
  • 举报
回复
udp是不可靠的,但为什么我新建一个socket和客户端通信丢包,会比用单一的socket和客户端通信丢包高呢?

答: 新建一个socket到准备好收包,需要些时间,这段时间内的包当然就丢了. 另一方面,socket多了收包控制就更加不容易,所以就更容易丢,具体要看代码怎么做.
  • 打赏
  • 举报
回复
情况一:
服务器
while(true) recvfrom(socketA); //直接接收
客户端 send() 10000个数据报;

情况2:
服务器:
recvfrom(socketA); //获得客户端地址
while(true) recvfrom(socketB); 接收

客户端
send(test)
send () 10000个数据报;


情况2效率为什么会比情况1低呢?
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 peergine 的回复:]

1)UDP是不可靠的,你需要自己实现确认重传机制才能保证可靠性.
2)UDP用一个socket就可以处理多个客户端,用IP地址来区别各个客户端.不需要每个客户端分配一个socket.
[/Quote]

udp是不可靠的,但为什么我新建一个socket和客户端通信丢包,会比用单一的socket和客户端通信丢包高呢?
peergine 2010-11-20
  • 打赏
  • 举报
回复
1)UDP是不可靠的,你需要自己实现确认重传机制才能保证可靠性.
2)UDP用一个socket就可以处理多个客户端,用IP地址来区别各个客户端.不需要每个客户端分配一个socket.

18,356

社区成员

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

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