怎么解决TCP网络传输「粘包」问题

回答问题之前,先来纠正题主的一个错误概念,TCP是一种基于字节流的协议,根本不存在所谓的“包”,更不必说粘包。
我想题主应该想问:TCP传输协议下,应用层数据发送和接收问题。
官方文档说的已经很清楚了,send和recv的返回值表示成功发送/接收的字节数。
man sendman recv此时,不仅不会有「粘包」的错觉,甚至如何解决都知道了。
数据没发完?
继续发呗;
没收完?
继续收就行了。
那么如何知道数据没有收完呢?
其实约定个特殊字符作为结束符(比如HTTP协议以\r\n\r\n作为结束标志)或者提前约定好数据长度就可以了。
实例:下面看看项目开发中常用的方法,「设置定长消息」。
先收取一个固定大小的包头信息,接着根据包头里面指定的包体大小来收取包体大小。
具体的代码示例如下所示:程序员,一定要多看官方文档!多看官方文档!多看官方文档!这可比某些所谓的博客要严谨的多。
本文为作者“一个程序员的奋斗史”悟空问答原创文章,未经允许转载、抄袭必究!

标签