QT的socket通信机制

刚接触QT的socket通信,在网上查的资料都没具体的说明其中的机制,导致在开发的过程中,误以为和C++的socket通信机制差不多,找了好久才解决的问题。

在网上的大多数资料都只是在简单情况下的通信,而我发现QT的socket通信机制是这样的,当从服务端或客户端第一次收到readyRead信号,然后读取包体没有读完的时候,readyRead信号会再次触发,然后再次进入槽函数。

connect(mopTcpSocket, &QTcpSocket::readyRead, this, &ClientNetObject::mvslotsRecvMessages);
void ClientNetObject::mvslotsRecvMessages()
{
	
    if () // 首先读取头信息
    {
        int recv_len = mopTcpSocket->bytesAvailable();
        if () // 不能小于头字节数
        {
            return;	// 如果没有读完的话,还会再次进入槽函数
        }
        else
        {
            // 读取头信息并标注头信息已经被读取
            mbIsTcpRecvHeadOk = true;
			
        }
    }
    //else // 读取包体
    {
        tcpRecvBlock.append(mopTcpSocket->readAll());
		if (tcpRecvBlock.size() > mopPackage->BodyLength + 1)
		{
			//粘包问题
			QByteArray save_data;
			QByteArray ba("}");
			int length = 0;
			length = tcpRecvBlock.indexOf(ba, 0);
			save_data = tcpRecvBlock.left(length + 1);
			tcpRecvBlock.clear();
			tcpRecvBlock = save_data;
		}
        // 当tcpRecvBlock的大小和实际大小相等时认为读取完毕
        if (tcpRecvBlock.size() == mopPackage->BodyLength + 1)
		{
		..........
            .....
            // 重新复位
            mvReset();
        }
        else
		{ // 未读取完
            qDebug() << "******************************************Read not completed*******************";
            return; // 如果没有读完的话,还会再次进入槽函数
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值