qt如何处理qtcpsocket粘包

2025-10-12 09:57:57

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

qt如何处理qtcpsocket粘包

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

qt如何处理qtcpsocket粘包

3、3.粘包处理前

服务器端发送数据:

//出现一个新连接时调用void myTcpServer::incomingConnection(int socketDescriptor){    clientConnection = new QTcpSocket;    clientConnection->setSocketDescriptor(socketDescriptor);    clientConnection->write("data1");    clientConnection->write("data2");    clientConnection->write("data3");}

qt如何处理qtcpsocket粘包

4、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、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、6.客户端

void myTcpClient::slotRead(){    while(tcpSocket->bytesAvailable()>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粘包

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢