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

发布了130 篇原创文章 · 获赞 147 · 访问量 29万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览