请问 UDP 的完成端口 是不是 每个工作者线程对应一个socket就可以了。
第一个工作者线程的流程就是
workThread()
{
WSARecvfrom(m_sock[0],…………);
while(1)
{
GetQueuedCompletionStatus(…………);
if(发送数据)
{
发送成功了。下面接着等待读取。
WSARecvfrom(m_sock[0],…………);
}
else if(收到数据)
{
根据取回的内容,得到客户端地址,然后
WSASend(…………);
}
}
}主线程就是简单的,创建N个工作者线程,然后建立N个socket 即 m_sock[N]这样做对吗?功能是每来一个客户数据,服务器就根据得到的数据返回响应的结果给客户端。 这样做效率如何?是不是应该多投递几个WSARecvfrom????

解决方案 »

  1.   

    工作者线程里只是接收传到的数据,执行速度会很快的
    接收完后,立即WSARecvfrom即可的
      

  2.   

    不需要每个工作线程对应一个SOCKET。一个工作线程可以对应非常多的SOCKET。
      

  3.   

    应该是每个客户端连接至少一个socket
    而不是 每个工作者线程对应一个socket
      

  4.   

    1.一般创建的IOCP工作者线程是CPU个数的2倍,或者2倍+22.每个客户端连接对应一个SOCKET3.IOCP自己会处理处理工作线程的4.WSARecvfrom收到数据后,把数据抛给处理线程,继续WSARecvfrom就可以了
              switch(pPerIO->OperatorType)
    {
    case IO_RECV: //完成一个接收请求
    {
    //接收到的数据处理
                                         //继续抛出接收命令
    ::WSARecv(...);
    }
    break;
    case IO_SEND: //完成一个发送请求
    ;
    break;
    case IO_END:  //完成一个结束请求
    ;
    break;
    default :
    ;
             }
      

  5.   

    谢谢你,不过你是不是搞成TCP了? 我这里是UDP喔,应该一个socket就行。。对吧?