服务端采用完成端口,
在收到POST_RECV的操作类型以后,分析收到的客户端数据,并马上调用send返回结果给客户端,然后再投递一个WSARecv操作。结果,客户端只在第一次发送数据到服务端,可以正确收到服务器的回应。
下面再发一次,尽管服务器收到了,也调用send发送数据给客户端了,
但是客户端就是收不到数据,recv(...)停在那里了。这是怎么回事?

解决方案 »

  1.   

    服务器发送send之后有没有察看是否发送正确,也就是send是否正常返回?先确定服务器的send返回正常再查客户端
      

  2.   

    是不是粘包,可以把客户端接收到的信息trace出来看看
      

  3.   

    原因找到了,我在第一次投递WSARecv之前,清除了PER_IO_OPERATION_DATA,这在第一次是正确的。
    但是如果第二次再投递WSARecv之前还这么做的话,就清空了历史记录的重要信息,
    例如:该完成端口对应的socket套接字句柄。socket套接字句柄都不对,发送数据自然就失败了。