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

ithewei CSDN认证博客专家 c/c++ Qt libhv
编程之路,其路漫漫,吾将上下而求索
https://github.com/ithewei
https://hewei.blog.csdn.net
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页