IOCP踩坑

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, GetAcceptExSockaddrsConnectEx, DisconnectEx需要通過WSAIoctl獲取函數指針

AcceptExConnectExWSARecvWSASend這些重疊IO函數和IOCP的完整使用示例參考
https://github.com/ithewei/hw/blob/master/event/overlapio.c
https://github.com/ithewei/hw/blob/master/event/iocp.c

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章