网络编程效率差的问题?
目前在开发一个项目,使用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多毫秒才接收到信息帧。
我感觉这个现象很不正常,想请教各位问题的原因大概有哪些?可以从哪些方面去着手观察并优化?