qt如何处理qtcpsocket粘包

 时间:2024-10-17 00:41:52

1、一个数据包由包头跟包体组成,包头中包含包体长度,包体为要发送的数据。

qt如何处理qtcpsocket粘包

2、发送端将数据打包,接收端将数据接收到缓冲区后,从缓冲区起始处解析数据,先找到包头,然后找到包头中表示包体大小的字段,根据包体大小找到包体数据。

qt如何处理qtcpsocket粘包

3、粘包处理前服务器端发送数据://出现一个新连接时调用void myTcpServer::incomingConnection(int socketDescriptor) { clientConnection = new QTcpSocket; clientConnection->setSocketDescriptor(socketDescriptor); clientConnection->write("data1"); clientConnection->write("data2"); clientConnection->write("data3"); }

qt如何处理qtcpsocket粘包

4、客户端接收数据void myTcpClient::slotRead() { while(tcpSocket->bytesAvailable()>0) { int length = tcpSocket->bytesAvailable(); char buf[length]; tcpSocket->read(buf, length); printf("%s\n", buf); } }

qt如何处理qtcpsocket粘包

5、粘包处理后服务器端#pragma pack(push, 1) //按照1字节对齐typedef struct{ int 造婷用痃len; //包头,包体长度 char data[1024]; //包体}NetPacket;#pragma pack(pop)//出现一个新连接时调用void myTcpServer::incomingConnection(int socketDescriptor) { clientConnection = new QTcpSocket; clientConnection->setSocketDescriptor(socketDescriptor); char *d1 = "data1"; char *d2 = "data2"; char *d3 = "data3"; NetPacket p1, p2, p3; p1.len = sizeof("data1"); //封装第一个数据包 memcpy(p1.data, d1, p1.len); p2.len = sizeof("data2"); memcpy(p2.data, d2, p2.len); p3.len = sizeof("data3"); memcpy(p3.data, d3, p3.len); clientConnection->write((char *)&p1, sizeof(int) + p1.len); //发送数据包 clientConnection->write((char *)&p2, sizeof(int) + p2.len); clientConnection->write((char *)&p3, sizeof(int) + p3.len); }

qt如何处理qtcpsocket粘包

6、客户端vo坡纠课柩id myTcpClient::slotRead() { while(tcpSocket->b烤恤鹇灭ytesAvailable()>0) { int len; char buf[1024]; //接收数据的缓冲区 char tmpBuf[1024]; //存放包体 int nOffset = 0; //偏移 int n = tcpSocket->bytesAvailable(); //接收到的字节数 tcpSocket->read(buf, n); memcpy(&len, buf, sizeof(int)); //包头:包体长度 nOffset += sizeof(int); memcpy(tmpBuf, buf+nOffset, len); //包体 nOffset += len; printf("%s\n", tmpBuf); //打印包体 memcpy(&len, buf, sizeof(int)); nOffset += sizeof(int); memcpy(tmpBuf, buf+nOffset, len); nOffset += len; printf("%s\n", tmpBuf); memcpy(&len, buf, sizeof(int)); nOffset += sizeof(int); memcpy(tmpBuf, buf+nOffset, len); nOffset += len; printf("%s\n", tmpBuf); } }

qt如何处理qtcpsocket粘包
  • Win10系统如何取消windows安全中心提示
  • win10系统如何调整夜间模式强度?
  • 声音设备怎么下载
  • win10怎么恢复被卸载的自带记事本
  • 电脑换了个旧硬盘怎么用
  • 热门搜索
    数学手抄报六年级 关于环保的手抄报内容 节水节电节粮手抄报 民族团结手抄报花边 科技改变生活手抄报 八礼四仪手抄报内容 关于西游记的手抄报 爱眼手抄报 小学生手抄报版面设计图 廉洁教育手抄报