WsaRecv / GetQueuedCompletionStatus稍后读取数据

时间:2018-07-11 04:42:45

标签: c++ sockets visual-c++ winsock2 iocp

我们正在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;
        }
    }

0 个答案:

没有答案