博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

IOCP-------网络聊天室之 迷惑

Posted on 2011-04-23 10:02  小小行者  阅读(2718)  评论(9编辑  收藏  举报

   已经整整一个星期了,在研究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是 发送 或者 接受 数据的【向套接字接口】,然后协议把数据发送到目的端。但在上面的 代码里 提交 接收请求 ,我不明白其是接收空数据 还是 什么意思?

对路过的 博客园 朋友 致敬,谢谢你们,问题没有解决,我仍在努力!