GetQueuedCompletionStatus收到的是进出全部信息

解决方案 »

  1.   

    这个程序是一收到读数据马上就写回去,但是我给客户端群发后,没再向服务端发送数据啊,在GetQueuedCompletionStatus就不应该有读数据产生了啊,而应该阻塞啊!为什么还会死循环的读然后再写呢?
      

  2.   

    while( pos != NULL )
     pos处理了么?如果pos一直是非空呢???
      

  3.   

    case IOCP_WRITE:
     一直在写数据,当然iocp就一直响应
      

  4.   

    但GetQueuedCompletionStatus收到发送完消息后又在HandleData()里把它改为IOCP_READ了啊
      

  5.   

    你的过程有问题
    假设从这里开始
    switch( lp_io->operation )
     IOCP_READ:
    ->
    case IOCP_COMPLETE_READ:
              lp_io->operation = IOCP_WRITE;
    ->
    DataAction()
    case IOCP_WRITE:
    ->投递write
    ->GetQueuedCompletionStatus
    switch( lp_io->operation )
     case IOCP_WRITE:
        lp_this->HandleData( lp_io, IOCP_COMPLETE_WRITE );->HANDLEDATA()
    case IOCP_COMPLETE_WRITE:
               lp_io->operation = IOCP_READ;
    ->DataAction()
        case IOCP_READ:
    nRet = WSARecv( lp_io->socket,
    &lp_io->wsaBuf,
    1,
    &dwBytes,
    &dwFlags,
    &lp_io->ol,NULL);
    又开始读了。
      

  6.   

    这个recv如果完成了,又开始上面那个循环
      

  7.   

    case IOCP_COMPLETE_WRITE:
               lp_io->operation = IOCP_READ;
    把这个IOCP_READ改成IOCP_END行不行?
      

  8.   

    你说的WSARecv又开始接收数据,但是client端没把数据发过来,是不是完成端口也会收到读完成消息啊?
      

  9.   

    问题解决拉,原来是发送时有nRet = WSASend(
    pKey->socket, 
    &lp_io->wsaBuf,
    1,
    &dwBytes,
    0,
    &lp_io->ol,NULL);lp_io->ol应改为pKey->socket同时还要让pkey->operation=IOCP_WRITE防止读数据后又写数据的死循环!