IOCP函數
創建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返回10022
調用ConnectEx
前需要先調用bind
,綁定到一個指定端口,或者可以綁定到0讓系統自動分配端口
getpeername無法獲取到對端地址
對應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);
other
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