我的循环错了吗?我是否滥用ReadFile()和I / O完成端口?

我想使用命名管道(用于IPC)实现服务器/客户端。我使用异步(重叠)连接和I / O完成端口(我搜索了很多,似乎这是最有效的方法) 。 首先是代码: 服务器:http://pastebin.com/XxeXdunC 和客户:http://pastebin.com/fbCH2By8 问题出在服务器上(我可以改进客户端,但我会在服务器工作时这样做)。 我使用I / O完成端口:基本上,我运行一个调用ReadFile()的线程。如果它返回TRUE,我得到所有数据,如果它返回FALSE,并且错误是ERROR_IO_PENDING,我等待GetQueuedCompletionStatus()。 奇怪的是,即使我读取了所有数据,最后一次ReadFile()调用也会失败,错误是ERROR_IO_PENDING 我调用ReadFile()的线程是服务器代码的第64行。 客户端发送24个字节(字符串“salut,c'est le client!”)和ReadFile()缓冲区长度为5个字节(以检查我的服务器如何处理大于Readfile()缓冲区的数据) 输出是:
waiting for client...
WaitForMultipleObjects : 0
client connected (1)
ReadFile 1 msg (5 -> 05) : salut
ReadFile 2 msg (5 -> 10) : salut, c'e
ReadFile 2 msg (5 -> 15) : salut, c'est le
ReadFile 2 msg (5 -> 20) : salut, c'est le clie
ReadFile 2 msg (4 -> 24) : salut, c'est le client !
ReadFile2: ERROR_IO_PENDING
GQCIOS 0 255 003D3A18
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 5 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
GQCIOS 4 255 003D3A2C
ReadFile3: ERROR_IO_PENDING
ReadFile1: ERROR_IO_PENDING
我不明白的是,即使我读取了所有数据,ReadFile()仍然会返回一个挂起操作(在最后一个“msg”输出后它是“ReadFile2:ERROR_IO_PENDING”错误消息) 我的循环错了吗?我是否滥用了ReadFile()/ GetQueuedCompletionStatus()? 谢谢     
已邀请:
你的写作相关功能在哪里?看来您的代码顺序错误。在
_read_data_cb
例程中,应首先调用
GetQueuedCompletionStatus
,然后根据
lpOverlapped
参数,接收的数据应在ReadFile函数中指定的缓冲区中准备就绪。由于您正在调用Readfile而不检查
OVERLAPPED
是否是发送上下文或recv上下文的重叠结构,因此您无法获得预期的输出。以下代码应该清除:
while(TRUE)
{
    bReturnValue=GetQueuedCompletionStatus(pIOCPServer->m_pIOCP, &dwBytesTransferred,(DWORD *)pClient,reinterpret_cast<LPOVERLAPPED*>(&pOverlapped),INFINITE);
    if(!bReturnValue)
    {
        if(NULL==pOverlapped)
            continue;
        else
            break;
    }
    else
    {
        if(pOverlapped==NULL)
            continue;
    }
    if(dwBytesTransferred==0)
        break;
    if(lpOverlapped==&(pClient->m_pRecvContext->overlapped))
        pClient->handleRecvEvent(dwBytesTransferred)
    else if(lpOverlapped==&(pClient->m_pSendContext->overlapped))
        pClient->handleSendEvent(dwBytesTransferred)
}
...
    

要回复问题请先登录注册