我的程序是要把一台机上的几个.XML文件发送到另一台机.我采用的是典型的完成端口通讯方式.发送每帧256个字节.在一台机上测试服务器和客户端完全正常,而通过两台机连接起来后通讯测试,发现每发送到一个文件的最后一个包时(该包总长度小于256个字节了),收到一方收到的竟然是256个字节的东西,收到的包包含了下一个文件开头的一些字符.但在接下来收到的包的字节数为上次文件的最后一个包的字节数(<256).前面的那个256个字节好像WSARevv多收了一次!不知道怎么回事?,但如果在发最后一个<256字节的包时等个200ms就不会多收到一个256字节的东西了.(注意:本程序单机测试完全正常)困扰几天,忘有朋友指教,不甚感激!

解决方案 »

  1.   

    是TCP?TCP是基于流的协议,没办法保证你一次发送多少数据,接收方一次接收到的就是多少数据。
      

  2.   

    这很正常,发送包小时,会经常和其它包粘在一起,是由于nagle算法引起的。你需要自定义流式报文解析。
      

  3.   

    看看Nagle吧http://www.yesky.com/20021010/1634138.shtml
    http://searchwhatis.techtarget.com.cn/searchwhatis/268/2025768.shtml
      

  4.   

    你每次接收的WSABUF的len都设置为256当然接收的都是256字节数据,TCP是基于流的协议,你自己必须接收的长度,保证接收到完整的包,即不会少也不会多(多则把下一个包前面的数据给接收过来了)。
    正确的处理应该是第一次发起WSARevv,WSABUF的len应该是一个包的完整长度,buf是缓冲区起始位置,下次再发起WSARevv时要根据实际传输的字节数来调整len(len-=TranBytes)和buf(buf+=TranBytes)值.
      

  5.   

    至于后面接收的那个包,字节数正好是<256那个包的字节数,是因为你最后两个包加起来就是256+前一个包的长度(不足256),你既然前面接收了256个字节后面那次接收的字节数当然就是剩下的字节数了,其实就是反了过来,你的原意是要先接收<256再接收256,而实际的接收却是先接收256再接收<256,总的字节数还是相等的
      

  6.   

    很正常呀,tcp是流协议,没有边界的不能保证你发送的数据,一次到达对方的多接收几次