现在的位置: 首页 > 综合 > 正文

完成端口与套接字绑定的OVERLAPPED结构释放问题

2013年12月11日 ⁄ 综合 ⁄ 共 1024字 ⁄ 字号 评论关闭

2楼  kingzai   (stevenzhu) 五星用户 该版得分小于等于200000分,大于100000分  回复于 2005-01-09 13:58:59  得分 30
如何正确地关闭I/O完成端口一—特别是同时运行了一个或多个线程,在几个不同的套接字上执行I/O操作的时候。要避免的一个重要问题是在进行重叠I/O操作的同时,强行释放—个OVERLAPPED结构。要想避免出现这种情况,最好的办法是针对每个套接字句柄,调用closesocket函数。任何尚未进行的重叠I/O操作都会完成。—旦所有套接字句柄都已关闭。便需在完成端口上,终止所有工作者线程的运行。要想做到这一点,需要使用  
  PostQueuedCompletionStatus函数,向每个工作者线程都发送—个特殊的完成数据包。该函数会指示每个线程都“立即结束并退出”.下面是PostQueuedCompletionStatus函数的定义:    
  BOOL   PostQueuedCompletionStatus(  
          HANDLE   CompletlonPort,  
          DW0RD     dwNumberOfBytesTrlansferred,  
          DWORD     dwCompletlonKey,  
  LPOVERLAPPED   lpoverlapped,  
  );  
          其中,CompletionPort参数指定想向其发送一个完成数据包的完成端口对象。而就dwNumberOfBytesTransferred,dwCompletionKey和lpOverlapped这三个参数来说.每—个都允许我们指定—个值,直接传递给GetQueuedCompletionStatus函数中对应的参数。这样—来。—个工作者线程收到传递过来的三个GetQueuedCompletionStatus函数参数后,便可根据由这三个参数的某一个设置的特殊值,决定何时应该退出。例如,可用dwCompletionPort参数传递0值,而—个工作者线程会将其解释成中止指令。一旦所有工作者线程都已关闭,便可使用CloseHandle函数,关闭完成端口。最终安全退出程序。

抱歉!评论已关闭.