完成端口用WSASend发送数据的时候,当一个数据包被投递,WSASend返回,然后在某个时候GetQueuecompletionStatus返回,数据包一定被全部发送了吗?会出现有一部分没发需要我重发的情况吗?在我的测试中是全部被发送了的。但是我在SDK里的例子里看到有重发的代码。还有WSARecv也一定能一次把客户端发送的一个数据包一次收完吗?比如客户端发送4K的数据过来,完成端口线程里GetQueuecompletionStatus返回了,这4K的数据一定是全部被接收了而不是只接收一部分吗?

解决方案 »

  1.   

    有可能有些数据没有发送出去啊比方说你WSASend传的长度是aGetQueueCompletionStatus后,有一个NumberOfBytes,它告诉你实现完成了多少个字节如果NumberOfBytes< a,那么缓冲区内从NumberOfBytes到A处的内容没有被发送出去,你要重发。WSARecv不保证把你的缓冲区填满,实际读到的字节数是NumberOfBytes
      

  2.   

    但是我听别人说WSASend后就不用管了,,系统IO会自动重发到底怎么回事还有,一次WSARecv接收到的就一定是整个数据包吗?是否也还需要多次接收?
    如果需要多次接收的话,那么在下面这种情况下就不好处理了:
    客户端发送过来一个结构,
    struct data
    {
      int len;
      char buffer[4096];
      int flag;
    }data;len表示整个数据包的长度,假设服务器端一次没收完,这样就无法把收到的东西转换成相应的结构,也就无法得到数据包的len,无法知道数据包的长度,也就无法判断是否已经把数据包收完,,,我发现这东西麻烦得很,,,
      

  3.   

    你应该该结构体换成一个BYTE流(或者叫一个包),然后将这个流发送去,另外一端完整的收到这个流之后,再将这个流恢复成结构体。
      

  4.   

    回复人: xstring(麻雀) ( ) 信誉:211  2004-04-17 12:51:00  得分:0 
     
     
      你应该该结构体换成一个BYTE流(或者叫一个包),然后将这个流发送去,另外一端完整的收到这个流之后,再将这个流恢复成结构体。
     
     -=------------------------------------------------------------------
    这个我知道,问题是:
    如果这个BYTE流一次没收完,就没法恢复成结构体,无法恢复成结构体,就无法得到结构体里包含的包长度信息,得不到包长度信息就无法判断是否已经完整收完了这个包,,,回复人: starcbh(心有灵犀一点通(抵制日货)) ( ) 信誉:96  2004-04-17 13:38:00  得分:0 
     
     
      当然不一定了……用一个结构维护io请求包,网上很多例子
     
     ---------------------------------------------------------------------
    请问怎么维护?稍微说下思路?