GetQueuedCompletionStatus
全部标签 我有一个通过串行端口生成消息的设备。当我重新启动设备时,IO完成端口停止读取字节。代码是调用GetQueuedCompletionStatus():BOOLbRet=GetQueuedCompletionStatus(m_hCompletionPort,&dwBytesTransferred,&dwCompletionKey,&pOverlapped,INFINITE);PortMon看起来像:...IRP_MJ_WRITESerial1SUCCESSLENGTH:7REBOOT.IRP_MJ_READSerial1CANCELLEDLENGTH:1记录显示以下结果:bRet=true
我想使用线程池来启动/取消重叠读取操作——分别使用ReadFile()和CancelIo()——以及处理任何读取操作完成时的完成端口事件。任何线程都可以发起读操作任何线程都可以处理读取完成事件只有发起读取的线程可以取消它(这是一个CancelIo()限制)我不确定如何实现它。通常调用GetQueuedCompletionStatus()来等待完成端口事件,调用WaitForSingleObject()来等待正常事件,但不清楚如何混合使用这两者。如果PostQueuedCompletionStatus()让我指定一个特定的线程来唤醒我就会被设置。有什么想法吗?更新:该解决方案必须在Win
背景:我正在使用CreateIoCompletionPort、WSASend/Recv和GetQueuedCompletionStatus在我的服务器上执行重叠套接字io。对于流量控制,当发送到客户端时,我只允许在所有挂起的OVERLAP从IOCP弹出时调用几个WSASend()。问题:最近,有时OVERLAP没有返回到IOCP。调用GetQueuedCompletionStatus的线程没有得到它们,它们保留在我的本地待处理队列中。我已经验证客户端确实从套接字接收数据并且套接字已连接。进行WSASend()调用时未返回任何错误。如果没有像下面这样的外部刺激,重叠就“永远不会”回来:断
在《WinSockProgrammingFundamental:ACompilation》一书中,IOCP有这张图:我知道完成通知到达完成端口,并且四个排队的线程调用GetQueuedCompletionStatus()来获取完成数据包。但是完成端口下面显示的另外两个工作线程是做什么的,是不是这些线程也调用了GetQueuedCompletionStatus()但是他们已经收到了一个完成数据包,并且正在处理它? 最佳答案 正如MartinJames在他的评论中所说;QueuedThreads和WorkerThreads都是调用了Ge
到目前为止,我发现的所有示例要么只能读取或写入,要么是10000行的巨兽,我什至不知道从哪里开始了解它们的工作原理。为了测试我的代码,我将浏览器指向我的服务器并发送了一个简单的http请求。结果令人困惑。例如,有一次GetQueuedCompletionStatus返回并且WSARecv说它读取了我发送的http响应的字节数,尽管这个响应应该(并且确实)在客户端结束并且recvbuffer甚至没有填充这些字节。此外,我不明白在其他浏览器关闭连接后何时释放我的缓冲区,因为GetQueuedCompletionStatus在我调用closesocket后不断返回几次。此外,一旦GetQue
我有以下简化的IO完成端口服务器C++代码:intmain(..){startCompletionPortThreadProc();//Awaitclientconnectionsockaddr_inclientAddress;intclientAddressSize=sizeof(clientAddress);SOCKETacceptSocket=WSAAccept(serverSocket,(SOCKADDR*)&clientAddress,&clientAddressSize,NULL,NULL);//ConnectedCreateIoCompletionPort((HANDLE
win32如何在两个函数的上下文中管理OVERLAPPED结构的实例:GetQueuedCompletionStatusPostQueuedCompletionStatus当我调用GetQueuedCompletionStatus时,OVERLAPPED结构的win32自由实例还是我必须自己完成?当我使用PostQueuedCompletionStatus发送数据时,win32是否将其复制到内部结构?我什么时候必须释放已发送数据的内存?我在哪里可以找到有关GetQueuedCompletionStatus、PostQueuedCompletionStatus和IOCP队列之间OVERL
我在实现TCPIOCP客户端时遇到了一些问题。我已经在MacOSX上实现了kqueue,所以希望在Windows上做类似的事情,我的理解是IOCP是最接近的东西。主要问题是GetCompetetionStatus永远不会返回并且总是超时。我假设我在创建要监视的句柄时遗漏了一些东西,但不确定是什么。这是我到目前为止的进展:我的连接例程:(为清楚起见,删除了一些错误处理)structsockaddr_inserver;structhostent*hp;SOCKETsckfd;WSADATAwsaData;intiResult=WSAStartup(MAKEWORD(2,2),&wsaDat
切换到Windows8后,我的应用程序停止工作。我花了几个小时调试问题,发现IOCP的行为在Windows8和以前的版本之间有所不同。我提取了必要的代码来演示和重现问题。SOCKETsListen;DWORDWINAPIWorkerProc(LPVOIDlpParam){ULONG_PTRdwKey;DWORDdwTrans;LPOVERLAPPEDlpol;while(true){GetQueuedCompletionStatus((HANDLE)lpParam,&dwTrans,&dwKey,(LPOVERLAPPED*)&lpol,WSA_INFINITE);printf("de