已经整整一个星期了,在研究IOCP,其意义就是 服务于 服务器端处理大量并发的请求。如今也许只有一个问题困扰着我,我也是为了这一个疑问思考了这几天。遗憾的是,目前这还是疑问,我真切的 希望,路过的 老鸟 和 好鸟 能为我 解答这个疑问,谢谢了。。
研究过 IOCP 与 Socket 的朋友 都会知道 要处理什么。
1.创建完成端口。【至于 初始化环境什么的 都不说了,。。。。】
2.完成端口 与 接受套接字 关联。
3.开始投递 WSASend/WSARecv【或者是udp连接的 接/收 请求】。。 【这也就是我的 疑问】
。。此时投递的 请求意义是什么呢?略见 代码如下:
...............................................
//关联客户端到完成端口,句柄数据在此时被绑定到完成端口
CreateIoCompletionPort((HANDLE)Accept,CompletionPort,(DWORD)PerHandleData,0);
for(int i=0;i<IOWorkerNum;i++)
{
PPER_IO_OPERATION_DATA PerIoData=(PPER_IO_OPERATION_DATA)GlobalAlloc(GPTR,sizeof(PER_IO_OPERATION_DATA));
unsigned long Flag=0;
DWORD RecvByte;
ZeroMemory(&(PerIoData->OverLapped),sizeof(OVERLAPPED));
PerIoData->RecvDataBuf.buf=PerIoData->RecvBuf;
PerIoData->RecvDataBuf.len=BUFFER_SIZE;
PerIoData->OperType=RECV_POSTED;
//提交接收数据请求
WSARecv(PerHandleData->sClient,
&(PerIoData->RecvDataBuf),
1,
&RecvByte,
&Flag,
&(PerIoData->OverLapped),
NULL);
}
.....................
这就是 关联套接字后 开始投递多个WSARecv请求,
【问题1】:【投递请求的 意义是什么?有什么用呢?如果投递 WSASend请求 【一个或 多个】 后有什么意义呢?】
为了解答上面疑问,我也翻阅了 一些资料。个人理解如下:
完成端口 与 套接字 关联了之后,投递的 请求 我理解成是 I/O 通道,假如 投递了 2个 WSASend请求,和 2个 WSARecv请求。那么就相当于 在这个特定的SOCKET上建立了 2个 接收 通道,2个 发送通道,也就是 同时 允许2个 线程 来 处理 这个套接字上的 接请求 和 发请求。
【问题2】:【【这也许就是 重叠I/O的 意义,不知我理解的 对吗?】
但在 工作线程 中苦苦等待的 GetQueuedCompletionStatus 是干什么的呢? 其就是 与 完成端口配套的。这个API可以检测 完成端口的 状态。完成端口完成与否就会 被 这个API 检测到,然后 跟据 目前的 是Send 还是Recv,或者是 其余的 失败或断开等意外。。
【问题3】:【我老是认为 WSASend 或者 WSARecv是 发送 或者 接受 数据的【向套接字接口】,然后协议把数据发送到目的端。但在上面的 代码里 提交 接收请求 ,我不明白其是接收空数据 还是 什么意思?
对路过的 博客园 朋友 致敬,谢谢你们,问题没有解决,我仍在努力!