我自己定义了一个简单的传输协议,基于TCP做的。但是如果数据包大小限制在100个字节左右(包括了协议头),对方接收到的数据就会有错误,如果大小放大到1K一个,就可以正常传输。请问这是为什么?如果一个超过数据包大小的文件要传输,那么我会将它切割成多个数据包,然后分块传送。 现在就是对方的机器接收到之后拼装起来的数据是错误的,而1K 的包拼装起来就没有问题。  我对TCP/IP不是很懂,请指教 谢谢

解决方案 »

  1.   

    tcp协议保证包的次序、正确性
      

  2.   

    基于TCP协议,然后自己做数据包的分片和重组
    TCP自己本身就实现了数据包的分片和重组,以及错误重传。保证数据的可靠传输。
    你画蛇添足的来做,不明白你想做什么。如果每次只想发100字节,那你每次发100字节不就好了。难道你想把一个TCP包分成两个发送?!那楼主可以圆满了。
      

  3.   

    1 用TCP直接发送就是,你就不必分割了,除非你要考虑别的因素(e.g, MTU,IP分片)。不过调用Send()要注意判断成功发送了多少个字节。接收用recv()得注意判断成功接收的字节数。当然你的自定义协议里肯定描述你的总数据长度。2,
    TCP: 面向连接的可靠的传输协议。
    UDP:无连接的不可靠的传输协议。3, 建议看《TCP/IP详解》.
      

  4.   

    有这种应用很正常,使用TCP协议传输数据必须有应用层协议,否则怎么区分您传输的数据是文件大小、文件内容、文件名?出现楼主问题的原因,我想可能是nagle算法在作怪,可以关闭nagle算法试试。简单的说,就是WinSock为了提高网络通信性能,把你的几个小数据包一起发过去了。问题肯定出在接收端,也可能是您定义的协议不合适,没有处理几包数据粘在一起的情况。
      

  5.   

    nagle算法可以选择关闭。默认是开启的,它会根据网络情况自己决定是否使用。
    强制关闭后,就可以单独的send一次就实际发一次了