当我正在使用完成端口的时候,如何使用关闭一个端口假设以问答方式进行工作。当我receive 一些数据以后。 我可能要send 一些数据出去,同时再次调用receive
 那么一个端口 就有2个部分在完成端口里面了。 此时,我的系统发出了命令,强制要求断掉某些
 socket , 那么我应该怎么断? 平时 我靠 GetQueuedCompletionStatus 来获取  // 获取队列中iocp中的状态
  if (GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,
         (LPDWORD)&PerHandleData, (LPOVERLAPPED *) &PerIoData, INFINITE) == 0)
 当 BytesTransferred ==0   我知道对方断了,或者在receive 返回后,可以close掉,
 但现在的情况是 send  receive 也许并未返回呢。正被挂起呢

解决方案 »

  1.   

    我不是指超时,而是指 当我的系统要求关闭某些端口,那么是否在这个端口的send 和receive返回以前是无法关闭的?
    超时的话,我想让系统无论是send 还是recieve 30秒内一定要告诉我, 
    建立完成端口 有2个地方 第一个是 一开始if ((CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0)) == NULL)
       {
          printf( "CreateIoCompletionPort failed with error: %d\n", GetLastError());
          return;
       }第二个是 当有新连接连进来以后
     if (CreateIoCompletionPort((HANDLE) Accept, CompletionPort, (DWORD) PerHandleData,
             0) == NULL)
          {
             printf("CreateIoCompletionPort failed with error %d\n", GetLastError());
             return;
          }我的超时是否加在第二个上面?如果成功了,是否 GetQueuedCompletionStatus 的时候30秒内就一定有反应?
    这样设定主要是为了提高系统的相应度
      

  2.   

    可以close socket,但不要删除send,recieve使用的内存。 这时GetQueuedCompletionStatus会立即返回该socket的错误。
      

  3.   

    你正常关闭就行,之后GetQueuedCompletionStatus返回的,只是返回里的传输字节数为0,这是你就该删除的删除,该释放的释放就行了。
      

  4.   

    还有一种情况  当我WSASend 一些数据后,又有一些数据需要WSASend第一次WSASend 还没有返回,我是否只能阻塞自己的线程,直到 第一次成功?还是可以无所谓继续压进去? 先后顺序 有问题码?
      

  5.   

    还有一种情况  当我WSASend 一些数据后,又有一些数据需要WSASend第一次WSASend 还没有返回,我是否只能阻塞自己的线程,直到 第一次成功?还是可以无所谓继续压进去? 先后顺序 有问题码?***************************************************************没有必要阻塞线程啊,如果阻塞了还不如去用同步的套接字呢,你说呢? 你可以为每个连接设置一个发送队列,把任务投递到队列中,这样当每一个WSASend返回以后重队列中区出新的元素然后发送。
      

  6.   

    还有一种情况  当我WSASend 一些数据后,又有一些数据需要WSASend第一次WSASend 还没有返回,我是否只能阻塞自己的线程,直到 第一次成功?还是可以无所谓继续压进去? 先后顺序 有问题码?***************************************************************能不能继续压进去取决于你的协议是否能够保证数据的完整性,如果健全是可以的,但是你要考虑数据量的问题,也就是说你压得多资源消耗也大
      

  7.   

    你可以为每个连接设置一个发送队列,把任务投递到队列中,这样当每一个WSASend返回以后重队列中区出新的元素然后发送考虑过的。也这么认为。没实践过
      

  8.   

    问个问题:如果服务器在回送客户端一个很大的buffer,这个时候,程序设置的标志是IoWrite,可正好客户端发送了一份数据过来了。那么这个时候,GetQueuedCompletionStatus捕获到的是写返回还是客户端发送的返回怎么辨别???
      

  9.   

    是吗?呵呵。那就容易沟通了。。
    不过我确实不是很在乎分数的。以前我都是上chinaunix的,很少上csdn的,要是为了分数,混几颗 猩猩 因该没问题的吧。
    楼上哥们在那里作的?
      

  10.   

    呵呵 三个都是混6年了啊,缘份啊 呵呵, 有兴趣的话 MSN上聊聊 我的是: ProgrameMan##hotmail.com  ## 换成 @
      

  11.   

    现在有事,过一会再来,或者你加我的MSN, MSN 上说
      

  12.   

    bSuccess=GetQueuedCompletionStatus(hIOCP,&dwIOSize,(LPDWORD)&lpConnCtx,&pOverLapped,INFINITE);if(lpConnCtx==NULL) //线程结束
      break;if(!bSuccess) //出错,包括异常断开
    {
      Remove(lpConnCtx);
      continue;
    }if(bSuccess&&(dwIOSize==0) //正常断开
      {
        Remove(lpConnCtx);
        continue;
      }
      

  13.   

    在remove里面就可以closedocket来关闭端口(acceptsocket)