我们正在vc ++中将IOCP与Winsock 2配合使用,并且重叠了WsaRecv以在套接字上发出异步读取请求。工作线程正在等待GetQueuedCompletionStatus接收数据。我们已经应用了Wireshark,并观察到有时并非每次数据都在00:00:01到达,而是GetQueuedCompletionStatus在8-10秒后接收到它,而不是立即或在毫秒后发生事件。线程在GetQueuedCompletionStatus处于等待状态时被阻止,因此我不怀疑我们的代码是否犯规。有任何人观察到或经历过。任何建议的解决方案,因为我们不能承受关键任务应用程序的延迟。我们也已经应用了此注册表补丁,但没有影响。 Improve recv latency by ignoring push flag
这是写在工作线程中的。
BOOL bReturn = GetQueuedCompletionStatus(
m_hCompletionPort,
&dwBytesTransfered,
(PULONG_PTR)&lpContext,
&pOverlapped,
INFINITE);
这是已经通过套接字发出的异步WsaRecv。
if(WSARecv(m_socket,m_receiveBuffer->GetIOBuffer(),1,&dwBytes,&dwFlags,&(this->m_receiveOV.ol),NULL)==SOCKET_ERROR)
{
int error = WSAGetLastError();
if(error!=ERROR_IO_PENDING)
{
this->Close(iThreadNo);
return false;
}
}