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

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