用完成端口写了一个简单的服务器程序,在工作线程中WSARecv操作完毕时,即
GetQueuedCompletionStatus(hComPort, &dwIoSize, (LPDWORD)&pClient, &lpOverlapped, THREAD_SLEEP_TIME);
这个函数成功返回时,接收到客户端的字节数dwIoSize是0,就是没有收到数据。但是如果是向客户端发送数据的话,能够成功把数据发送给客户端,也就是调用WSASend操作完毕,GetQueuedCompletionStatus函数返回时,dwIosize是成功发送数据的字节数请问这个是什么原因导致服务器接收不到客户端的数据,只能发送数据给客户端??谢谢

解决方案 »

  1.   

    老子晕了,非阻塞通信本来就是这样的,你只需要查下返回值是不是WSA_IO_PENDING
      

  2.   

    完成端口GetQueuedCompletionStatus返回时,它授信的对象不一定是recv完成了。这得看你设置的事件是什么了。而且没有谁会去查非阻塞通信返回的字节数,它本来就是未知数,它就是为零也可能正确。如果收不到收据只能是你程序有问题。
      

  3.   

    当然提供内存了,每一个连接,完成端口都必须对应一个请求,这个是得你自己做的,否则有事件完成了完成端口也没法通知你。还有就是你不能在wsarecv那去查返回的字节数,这是错误的做法,我说了2遍了,你还没理解,说白了吧,就是如果返回值为零的时候,也可能实际接收了n个字节了,这是非阻塞通信的概念的东西
      

  4.   

    1,要先投递recv请求
    2.注意投递时附带的io键要清零,
    可以参考我上传的源码