小编Oll*_*waa的帖子

IO完成端口:WSARecv()如何工作?

我想使用工作线程池和IO完成端口编写服务器.服务器应该在多个客户端之间处理和转发消息."每个客户端"数据位于ClientContext类中.使用工作线程交换此类实例之间的数据.我认为这是一个典型的场景.

但是,我有两个IO完成端口的问题.

(1)第一个问题是服务器基本上从客户端接收数据,但我不知道是否收到了完整的消息.事实上,WSAGetLastError()始终返回WSARecv()仍处于挂起状态.我试图用WaitForMultipleObjects()等待事件OVERLAPPED.hEvent.但是,它永远阻止,即WSARecv()永远不会在我的程序中完成.我的目标是在进一步处理开始之前完全确定已收到整条消息.我的消息在其标题中有一个"消息长度"字段,但我真的没有看到如何将它与IOCP函数参数一起使用.

(2)如果WSARecv()在下面的代码片段中被注释掉,程序仍会接收数据.那是什么意思?这是否意味着我根本不需要调用WSARecv()?我无法通过这些IO完成端口获得确定性行为.谢谢你的帮助!

while(WaitForSingleObject(module_com->m_shutdown_event, 0)!= WAIT_OBJECT_0)
{

    dequeue_result = GetQueuedCompletionStatus(module_com->m_h_io_completion_port,
                                               &transfered_bytes,
                                               (LPDWORD)&lp_completion_key,
                                               &p_ol,
                                               INFINITE);
     if (lp_completion_key == NULL)
     {
         //Shutting down
         break;
     }

     //Get client context
     current_context = (ClientContext *)lp_completion_key;

     //IOCP error
     if(dequeue_result == FALSE)
     {
         //... do some error handling...
     }
     else
     {   
         // 'per client' data
         thread_state = current_context->GetState();
         wsa_recv_buf = current_context->GetWSABUFPtr();

         // 'per call' data
         this_overlapped = current_context->GetOVERLAPPEDPtr();
     }

     while(thread_state != STATE_DONE)
     {
         switch(thread_state)
         {
         case STATE_INIT:

             //Check if completion packet has been posted by internal …
Run Code Online (Sandbox Code Playgroud)

c++ winsock iocp

4
推荐指数
1
解决办法
6013
查看次数

标签 统计

c++ ×1

iocp ×1

winsock ×1