请问一下,我现在做了一个在TCP客户端上使用IOCP模式,初始化时创建TCP套接字,创建IOCP句柄,使TCP套接字和IOCP句柄关联起来,创建工作线程,针对TCP套接字投递一个WASRecv操作,以下是代码:
m_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);m_sTCPSock = socket(AF_INET, SOCK_STREAM, 0);        CreateThread(NULL, 0, ServerWorkerThread, NULL, 0, &ThreadID);// Post Inital read operation for every socket in group
//
memset(&(m_PerOperation.OVerlapped), 0, sizeof(OVERLAPPED));
m_PerOperation.DATABuf.buf = m_PerOperation.Buffer;
m_PerOperation.DATABuf.len = 256;WSARecv(m_sTCPSock, &(m_PerOperation.DATABuf), 1, &RecvBytes, &Flag, &m_PerOperation.OVerlapped
, NULL);     在创建的工作线程中,首先connect连接服务器,连接成功以后就使用GetQueuedCompletionStatus等待,以下是工作线程代码:
      DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
      {
        while (1)
        {
            ret = connect(m_sTCPSock, (SOCKADDR *)&addr, iSize);
    if (ret == SOCKET_ERROR)
    {
  ErrorCode = GetLastError();
  TRACE("connect failure errcode:%x\n", ErrorCode);
    }
    else
    {
  break;
    }            BOOL bSuccess = GetQueuedCompletionStatus(m_hCompletionPort, &dwRecvByte, (LPDWORD)&addr,
(LPOVERLAPPED*)&PerIoHandleData, INFINITE);
        }
      }    现在的问题是连接成功以后在GetQueuedCompletionStatus就一直等待,接收不到WINDOWS底层的事件?????请高手帮忙看一下,多提宝贵意见,谢谢!

解决方案 »

  1.   

    经过我测试,是需要先connect连接上以后才能进行关联,然后投递一个recv消息,这样才能使用GetQueuedCompletionStatus接收到消息
      

  2.   

    搞定了?
    你的服务器端是怎么写的?也是IOCP?
      

  3.   

    有必要,因为我需要连接多服务器,同时和多个服务器进行I/0操作,同时还要和多个串口进行I/0操作。现在还有个问题在请教一下,我在CreateIoCompletionPort的时候,CompletionKey设置的是这个套接字的句柄,那我在GetQueuedCompletionStatus得到CompletionKey的时候,为什么不是这个套接字的句柄了?????是哪里还需要设置???
      

  4.   

    逻辑混乱,没有连接到服务器就绑定,就去接收消息,这样怎么能处理得到.
    在while循环里连接到服务器,蹩脚的代码.
    对IOCP理解不深!!!
      

  5.   

    你出现的问题可能是没有投递recv和send请求吧?IOCP是你先把recv和send请求投递出去,而工作者县城里GetQueuedCompletionStatus是告诉你请求已经完成(包括成功和失败的)
      

  6.   

    客户端用IOCP搞什么?
    最多一个WSASend WSARecv就足够了或者阻塞的socket也行。
      

  7.   

    你都没有吧套接字和IOCP关联,当然收不到了,你这个写法很有问题,你到网上搜个例子代码看了再重新写吧!!!
      

  8.   

    客户端select就够了,你不会有上千个服务器要连接吧
      

  9.   

    Overlap IO就可以了,IOCP确实没有必要在客户端程序中使用
      

  10.   

    lz没有理解IOCP。
    connect之后,你没有把这个socket向内核注册,你怎么GetQueuedCompletionStatus 出来。
    另外,lz对线程理解还不够
      

  11.   

    请问13L,客户端为什么客户端用select比用IOCP 好呢?
      

  12.   

    IOCP用在这里是大材小小小用了
      

  13.   

    客户端 wsaasyncselect就足够有余了
      

  14.   

    我的理解是完成端口是管理多个异步套件字的一种模式,通常可以管理成百上千个套接字的通信(因此一般用户服务器端的开发,如果你的连接数不多的话就不需要考虑IOCP了,因为它是几种异步模式中最复杂的一种)。楼主的代码中应该先把用于通信的套件字建立连接,在把处理连接状态的套件字和完成端口绑定,之后再进行数据的收发,每个套接字的收发操作完成之后都会被GetQueuedCompletionStatus检测到,该函数调用成功后可以获得哪个套接字的什么操作完成了,然后你再进行相应的处理,推荐楼主好好看看《Windows网络编程》中关于完成端口的那一小节,另外网络上有一个帖子,楼主也可以看看,叫做 很幽默的讲解Winsock六种IO模型