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

发布了127 篇原创文章 · 获赞 135 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/GG_SiMiDa/article/details/97938442
今日推荐