重叠IO中的完成例程模型,在完成例程中怎么区分是哪个SOCKET完成了操作? 我的 WSAOVERLAPPED 变量的Internal总是0

解决方案 »

  1.   

    你要使用重叠IO的话,建议最好使用IOCP模型,这个模型中,你可以把SOCKET跟IO端口句柄关联起来,这样每当操作完成时,你可使用GetCompletionStatus获得2个数据,一个是key,就是你的socket,另外一个就是overlap结构,这样就解决你的问题,个人认为微软的重叠模型,是个鸡肋。
      

  2.   

    完成例程就不能区分是哪个SOCKET完成了IO操作吗???
    有例程用这样的代码判断是哪个SOCKET.
    for(int i=0;i<nSockTotal;i++)
    {
        if(AcceptOverlapped[i].Internal == Overlapped->Internal)
            return i;
    }
    但,我实际运行的情况是, Internal 值总是0, 无法区分是哪个SOCKET完成了操作.
    在完成例程中应该怎么区分是哪个SOCKET完成了操作呢? Internal 可以手动指定一个值吗?
      

  3.   

    Internal貌似不是给你用的吧
    应该可以像完成端口一样,在Overlapped结构后面加上一个单I/O操作数据来识别吧
      

  4.   

    overlap的几个整形数字成员是不能给你用的,你真要保存你的socket,使用下面的方法;
    从overlap结构继承一个你自己的结构,myoverlap
    在myoverlap机构中添加一个SOCKET成员 _mysocket
    每次投递请求之前,把_mysocket设置成你的socket,把这个myoverlap传递给你的WSASend函数
    在接受到的时候,把overlap结构强制转换成你的myoverlap,里面的_mysocket就是你的原始socket了
      

  5.   

    这个方法好,直接绑定,也省去了查找SOCKET的时间