前言
TCP是一种流式协议,存在粘包的现象,所以需要分包处理。
数据包格式
不同格式的数据包的分包方法也不相同,本文使用的格式为:
#长度,包头:数据内容@
其中,长度是从包头到数据内容总字节数,4位定长。
代码
void RecvThread::run()
{
char buffer[2048] = {0}; // 用于存放读取到的数据
char *buf = buffer; //
int len = 0; // TCP通信读取到的数据长度
int bufferLen = 0; // 当前数据长度
int needLen = 0; // 还需要读取的数据长度
while(m_tcpConnectionClient->isOpen())
{
memset(buffer, 0, 2048);
// 查找开始标志
while(buf[0] != '#')
{
needLen = 1 - bufferLen < 0 ? 0 : 1 - bufferLen;
if (needLen == 0)
{
bufferLen -= 1;
memmove(buf, buf + 1, bu