IOCP的一些笔记

来源:互联网 发布:数据安全法规 编辑:程序博客网 时间:2024/05/22 02:30

本文只是记录下笔记,主要是参考资料的一些点,辅助个人理解,对其他人多半无用


OVERLAPPED(重叠结构)

CompletionPort(完成端口):暂时只用把它大体理解为一个容纳网络通信操作的队列


完成端口中
1.重叠结构要用几个
2.绑定完成端口的时候传入单句柄参数,即_PER_SOCKET_CONTEXT
if( NULL== CreateIoCompletionPort( (HANDLE)m_pListenContext->m_Socket, m_hIOCompletionPort,(DWORD)m_pListenContext, 0))

3._PER_IO_CONTEXT和OVERLAPPED关联:在投递请求时会新创建一个_PER_IO_CONTEXT,里面包含OVERLAPPED结构,会用到里面的缓存区和OVERLAPPED
1>if(FALSE == m_lpfnAcceptEx( m_pListenContext->m_Socket, pAcceptIoContext->m_sockAccept, p_wbuf->buf, p_wbuf->len - ((sizeof(SOCKADDR_IN)+16)*2),   
sizeof(SOCKADDR_IN)+16, sizeof(SOCKADDR_IN)+16, &dwBytes, p_ol)) 
2>WSARecv( pIoContext->m_sockAccept, p_wbuf, 1, &dwBytes, &dwFlags, p_ol, NULL );

4. BOOL WINAPI GetQueuedCompletionStatus(  
    __in   HANDLE          CompletionPort,    // 这个就是我们建立的那个唯一的完成端口  
    __out  LPDWORD         lpNumberOfBytes,   //这个是操作完成后返回的字节数  
    __out  PULONG_PTR      lpCompletionKey,   // 这个是我们建立完成端口的时候绑定的那个自定义结构体参数  
    __out  LPOVERLAPPED    *lpOverlapped,     // 这个是我们在连入Socket的时候一起建立的那个重叠结构  
    __in   DWORD           dwMilliseconds     // 等待完成端口的超时时间,如果线程不需要做其他的事情,那就INFINITE就行了  
    );

1>lpComletionKey获得绑定完成端口的_PER_SOCKET_CONTEXT
2>通过lpOverlapped获得相应的_PER_IO_CONTEXT

5.PostQueuedCompletionStatus()


如果在线程睡眠的时候,简单粗暴的就把线程关闭掉的话,那是会一个很可怕的事情,因为很多线程体内很多资源都来不及释放掉


参考资料:

http://blog.csdn.net/piggyxp/article/details/6922277

http://www.cnblogs.com/Hybird3D/archive/2012/02/02/2335000.html

http://www.cnblogs.com/Hybird3D/archive/2012/02/04/2337652.html


0 0
原创粉丝点击