创建IOCP句柄和关联套接字到IOCP句柄,都是通过CreateIoCompletionPort
创建IOCP句柄
HANDLE iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
关联套接字到IOCP句柄
CreateIoCompletionPort((HANDLE)fd, iocp, 0, 0);
获取完成事件
GetQueuedCompletionStatus(iocp, &bytes, &key, &povlp, timeout);
返回值为FALSE,表示有错误发生,可通过WSAGetLastError
获取错误码,超时错误码为WAIT_TIMEOUT
ConnectEx
连接失败,会返回对应错误码
WSASend
/WSARecv
失败,bytes=0
调用ConnectEx
前需要先调用bind
,绑定到一个指定端口,或者可以绑定到0让系统自动分配端口
对应AcceptEx
接收的connfd,getpeername
前需要调用
setsockopt(connfd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (const char*)&listenfd, sizeof(int));
对应ConnectEx
连接的connfd,getpeername
前需要调用
setsockopt(connfd, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, NULL, 0);
AcceptEx
, GetAcceptExSockaddrs
,ConnectEx
, DisconnectEx
需要通过WSAIoctl
获取函数指针
AcceptEx
,ConnectEx
,WSARecv
,WSASend
这些重叠IO
函数和IOCP
的完整使用示例参考
https://github.com/ithewei/hw/blob/master/event/overlapio.c
https://github.com/ithewei/hw/blob/master/event/iocp.c