我有一个在Windows XP平台(i7 2.1 Ghz处理器)上运行的应用程序。此应用程序是通过UDP在主节点和从节点之间进行基于主/从的通信。 主站发送请求,从站节点在其响应(突发模式)中发送每5毫秒的数据包,每个数据包包括标头1300字节。Winsock函数的执行时间太长
回到主节点,主线程接收数据并将其写入队列,触发并行线程从线程读出。
问题: 读取下一个数据包时,Winsock API的执行时间很长,所以数据正在从缓冲区中丢失。
执行时间:Recvfrom() - 200 - 400微秒。
Open_Sock()
{
socket();
//Error check
connect();
//Error Check
}
Receivethread()
{
sock again:
select(socket, read,write,excep,(0,0));
//error check
rc = recvfrom(socket,buf,len,0,&s_addr,&cln_alen)
if(rc>0) {
enqueue(queue,buf);
}
}
我确信Winsock API不需要很长时间才能获取下一个数据包。 但我找不到任何有关真实执行时间的信息。任何方向的帮助真的很感激。
使用IOCP,排队大量缓冲区,让内核填满他们的。稍后处理它们。 – 2013-03-08 15:41:27
能够为每个发送缓冲区调用recvfrom至少12.5次似乎应该足够充分(5ms/400us = 12.5)。你确定你正在处理的数据很快就完成了吗?另外,我们发现Windows倾向于丢弃比我们认为的更多的UDP数据包。我们将一个客户端/服务器Windows应用程序移植到Linux上,并使用相同的硬件丢弃了零个数据包。 – 2013-03-08 18:28:23
默认情况下,套接字以阻塞模式运行,所以'recvfrom()'将在退出之前等待数据到达。既然你使用'select()',那么在你调用'recvfrom()'之前,套接字是否处于可读状态呢?知道套接字处于阻塞模式,除非你的线程在等待数据时需要做其他线程,否则你也可以放弃select()。 – 2013-03-08 20:21:27