网络编程效率差的问题?

kacy16 2013-09-12 09:44:16
目前在开发一个项目,使用UDP协议进行相互的网络通信(内部的小型局域网),其中自定义了简单的应用层协议,

接收方:当接收到一帧信息后,马上回送一帧确认信息帧。
发送方:发送一帧信息后,循环等待一定的次数,从一全局的接收队列中查找该发送帧的确认信息帧,
确认已经收到信息帧。

具体的实现方式:网络通信这一块有两个独立线程(整个软件总共有大概6个线程左右),分别对同一个socket文件描述符进行读写。
接收线程: 采用select+recvfraom的模式,把接收到的数据存放到接收数据队列中。
发送线程: 发送一帧数据,usleep(20000), 然后循环等待一定的次数从接收数据队列中查找确认帧。
大致的代码如下:
ret=sendto(m_fdsock,data)
usleep(20000);
for(i=0; i<30; i++)
{
usleep(20000);
ack_ret=find_ackframe(g_revlist);
if(ack_ret)
break;
else
continue;

}

系统环境: OS是 center os 6.3(linux 2.6.32),内部的小型局域网, 目前测试还是一对一的机器在进行通信,
即一台服务端,只联了一台客户端。信息数据帧的数据量才60个Byte左右。
在服务端 ping 客户端的话,观察到的往返时间平均在 2ms左右。

观察到的现象: 需要循环20几次才接收到确认信息帧,即是发送了一帧信息帧后,过了400多毫秒才接收到信息帧。
我感觉这个现象很不正常,想请教各位问题的原因大概有哪些?可以从哪些方面去着手观察并优化?
...全文
335 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
UDX协议 2013-09-24
  • 打赏
  • 举报
回复
两种情况,1种是你没有及时的把你的包发出去,当循环一次后,花费了400MS = 20ms * 20次。 2.接收线程是一种非事件唤醒机制,线程切换是按你的Sleep来完成,占用了较多时间。
UDX协议 2013-09-24
  • 打赏
  • 举报
回复
了解一下UDX协议,UDP的可靠传输。
czc1009 2013-09-17
  • 打赏
  • 举报
回复
建议使用select,尽量避免人为的设置时限
max_min_ 2013-09-12
  • 打赏
  • 举报
回复
这个应该是代码的bug的吧!企鹅公司听说就是用这种方式处理QQ消息的啊! 你程序中为什么要sleep呢? 用fcntl函数和select函数配套使用下
木头菇 2013-09-12
  • 打赏
  • 举报
回复
首先,发一个然后等着确认再发第二个,这个模式就效率不高。可参考tcp的机制。 再来,你的程序usleep一共耗时多少你可以累加看看,你这个流程貌似很简单,先不用上升到网络模型,重点在你的程序逻辑
max_min_ 2013-09-12
  • 打赏
  • 举报
回复
引用 3 楼 kacy16 的回复:
[quote=引用 2 楼 max_min_ 的回复:] 这个应该是代码的bug的吧!企鹅公司听说就是用这种方式处理QQ消息的啊! 你程序中为什么要sleep呢? 用fcntl函数和select函数配套使用下
谢谢max_min_的提醒,我的程序中使用sleep的目的是在发送后延时,把CPU的控制权从发送线程能够转移到接收线程,好让接收线程能够去接收数据并放置到接收队列中,这时候sleep完后,发送线程再去接收队列查找,则应该能找到。 你说的“fcntl函数和select函数配套使用”是否把socket设置为非阻塞型的意思呢?谢谢![/quote] 嗯!并用select函数去监测是否有准备号的套接字进行读写操作! 不需要这么固定的去等待时间一直阻塞的
kacy16 2013-09-12
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:
这个应该是代码的bug的吧!企鹅公司听说就是用这种方式处理QQ消息的啊! 你程序中为什么要sleep呢? 用fcntl函数和select函数配套使用下
谢谢max_min_的提醒,我的程序中使用sleep的目的是在发送后延时,把CPU的控制权从发送线程能够转移到接收线程,好让接收线程能够去接收数据并放置到接收队列中,这时候sleep完后,发送线程再去接收队列查找,则应该能找到。 你说的“fcntl函数和select函数配套使用”是否把socket设置为非阻塞型的意思呢?谢谢!

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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