http://www.cnblogs.com/gaochundong/archive/2013/04/14/csharp_udp_datagram_splitter.html

解决方案 »

  1.   

    这个实现是错误的,因为它没有考虑到基本的UDP包丢失的情况。最好用TCP。TCP是可靠的,也不需要你字节去分包。
    而基于UDP的可靠传输并不容易做。UDP比较适合那些允许一定丢包的情形,比如视频播放中少一两帧影响不大。
      

  2.   

    所谓“分包”,是业务信令设计问题,不论 UDP 还是 TCP都需要信令设计。有些人去拿底层 IP 通讯的规范中的“数据包”概念去套,这到了真正需要用的时候,自然是“什么都不会了”。(因为底层再怎样分包,也不过是为了传送 byte 数据流而已,跟业务无关!)设计业务信令,需要你从业务角度去出发,没有人能够替代你做最终的设计。因此主要是靠经验积累。我们可以举一个例子:例如发送某个文件(文件名唯一),那么我们可以最少定义三个通讯信令。
    1. 传送文件的数据块,包括数据块内容、在文件中的偏移地址。
    2. 获取文件某一块数据的校验值。这样可以通过检查对方文件的某一块数据的校验值,来判断是否需要重传。
    3. 设置文件的总长度。这样给对方的文件设置长度,自动补充“0字节”或者自动截断多余的内容。通过至少这3个命令,我们可以为对方传送文件。甚至可以用“1秒钟”传送1G大的文件。从这个例子可以看出,如果你脱离了业务,你除了死抠“底层的数据分包”的名词儿是没有办法完成业务的。站在实践者的角度,那些貌似“过分技术化”的人往往是成事不足百事有余的,你必须根据业务的需求来设计更高层次的信令格式。不是含糊其辞地说一句“分包发送啊”就能知道你的需求的。
      

  3.   

    比如有些基于 http 的视频协议,每一个“包”通常只有2k大小。本来 http 可以传很大的内容(至少比你说的 64k 大千倍),可是人家为什么规定只传2、3k 呢?因为不是纠结于传多大字节的问题。一次send信息时,能传出去3k也就足够用了。
      

  4.   


    E. UDP就是要做成跟TCP一样的 Request->Ask 机制 只是TCP有帮我们做好了这种,
    UDP 你发一个包过去,对方接到后,回复一个我已收到,此时才继续发第二个包。如果发一个包后在一定时间范围内对方没有应答已收到,那将再发一次同样的包,连续试三次,对方都没有应答。说明掉线。