tcp粘包和拆包、断包
来源:互联网 发布:帝国cms分页样式修改 编辑:程序博客网 时间:2024/05/02 01:50
数据传输时,我们经常会使用tcp协议传输数据。当我们使用tcp长连接传输不同类型的数据时,会产生粘包、拆包的问题。
粘包的产生:粘包可能在服务端产生也可能在客户断产生,提交数据给tcp发送时,tcp并不立刻发送此段数据,而是等待一小段时间,看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去,造成粘包;另一端在接收到数据库后,放到缓冲区中,如果消息没有被及时从缓存区取走,下次在取数据的时候可能就会出现一次取出多个数据包的情况,造成粘包现象。
断包的产生:使用tcp传送数据时,有可能数据过大,使得发送方缓冲区无法一次发送,造成另一端只收到的数据不完整,所以要等待数据完全接收到再解析数据。
tcp粘包、半包的处理方式:一是采用分隔符的方式,采用特殊的分隔符作为一个数据包的结尾;二是采用给每个包的特定位置(如包头两个字节)加上数据包的长度信息,另一端收到数据后根据数据包的长度截取特定长度的数据解析,假设包头信息的数据长度为infoLen,接收到的数据包真实长度为trueLen,那么有如下几种情况:
1、infoLen>trueLen,半包。
2、infoLen<trueLen,粘包。
3、infoLen=trueLen,正常。
while (1) {
var packLen = _.unpack('packLen', tcpBuffer.slice(0, 2));
len = packLen.len;
// console.log('pack len------:' + len);
// console.log('true len------:' + tcpBuffer.length);
if (len > tcpBuffer.length) {
writeLog('info', 'code:2011 half pack', null);
return;
}
tcp_pack_unpack(tcpBuffer.slice(0, len));
if (len == tcpBuffer.length) { //pack end
tcpBuffer = new Buffer(0);
return;
} else { //pack not end
writeLog('info', 'code:2100 more pack in one buffer', null);
tcpBuffer = tcpBuffer.slice(len);
}
}
- tcp粘包和拆包、断包
- TCP粘包和拆包原因
- TCP 粘包 和 拆包
- TCP粘包和拆包原因
- TCP粘包、拆包
- TCP粘包,拆包
- Socket/TCP粘包、多包和少包, 断包
- Socket/TCP粘包、多包和少包, 断包
- Socket/TCP粘包、多包和少包, 断包
- Socket/TCP粘包、多包和少包, 断包 .
- UNIX网络编程——Socket/TCP粘包、多包和少包, 断包
- Socket/TCP粘包、多包和少包, 断包
- Socket/TCP粘包、多包和少包, 断包
- Socket/TCP粘包、多包和少包, 断包
- Socket/TCP粘包、多包和少包, 断包 问题
- Socket/TCP粘包、多包和少包, 断包
- Socket/TCP粘包、多包和少包, 断包
- Socket/TCP粘包、多包和少包, 断包
- python爬hdu网页
- Educational Codeforces Round 6
- Linux 下 一些文件的权限
- [C++] 静态成员函数
- MFC---CFileDialog打开文件对话框
- tcp粘包和拆包、断包
- eclipse环境搭建之二:C++
- Android Button2.监听事件
- Android Context 上下文或者叫做场景
- Power of Two
- bzoj 1083 繁忙的都市
- BLE Android开发中的问题
- 哈希图像检索—图像数据集获取链接总结【Hashing数据集】
- Java递归删除文件夹