Qt中处理Tcp粘包

处理粘包的方式是在消息头部加上消息总长度。

采用该格式:

消息总长度len(4字节)+命令字commandId(4字节)+消息msg。

思路是用一个buffer,每次有消息就读完,然后判断buffer长度,收到四字节长度len后,根据len收消息,当buffer.size()>=len,这时已经收到一个完整的包就可以处理了,处理完后就将buffer前len个字节删除掉,如此反复。

//socket有数据到来就读
connect(m_socket, SIGNAL(readyRead()), this, SLOT(ReadData()));

void Foo::ReadData()
{
	m_buf->append(m_socket->readAll());	//buf是QByteArray指针,可以在类内定义

	int ret = 1;
	while (ret > 0)
	{
		ret = TryDecode(*m_buf);
		if (ret < 0)
	        qDebug() << "TryDecode() failed";
		else if (ret > 0)
			m_buf->remove(0, ret);
	}
}

int Foo::TryDecode(QByteArray& buf)
{
	if (buf.size() < 4)
		return 0;

	quint32 len = qFromBigEndian(*(qint32*)buf.data());
	//限制长度
	if (len > 1024 * 1024 * 1024)
		return -1;

	if (buf.size() >= len)
	{
		qint32 commandId = qFromBigEndian(*(qint32*)(buf.data() + 4));
		qDebug() << "recv commandId: " << commandId;
		if (commandId == MsgType::heartbeat)
		    qDebug() << "recv heartbeat";
		if (commandId == MsgType::other)
		{
		    //处理other消息		
		}
		return len;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值