-
qt下解决粘包问题:数据前四个字节放入数据长度
const QByteArray &data QByteArray aps; int len=data.length(); aps[3] = (unsigned char)(0x000000ff & len); aps[2] = (unsigned char)((0x0000ff00 & len) >> 8); aps[1] = (unsigned char)((0x00ff0000 & len) >> 16); aps[0] = (unsigned char)((0xff000000 & len) >> 24); aps+=data; aps前四个字节代表了要发送数据的长度
-
将数据base64编码后用@#符号夹在中间,接收端解码
3.最近跳到了一个使用标准库的公司,需要使用标准库string和char * 处理粘包问题,具体编码解码:
编码:
string xystr = ~(~)//获取需要传输的数据
int dataLength =xystr.size();
//将数据前四个字节放入数据长度以解决粘包
int realLength = dataLength + sizeof(int);
char *sendData = new char[realLength];
memset(sendData, 0, realLength*sizeof(char));
unsigned int num1, num2, num3, num4;
char *p = (char *)&dataLength;
num1 = ((int)*p);
num2 = ((int)*(p+1));
num3 = ((int)*(p+2));
num4 = ((int)*(p+3));
memcpy(sendData, &num4, sizeof(int));
memcpy(sendData+sizeof(char), &num3, sizeof(int));
memcpy(sendData+2*sizeof(char), &num2, sizeof(int));
memcpy(sendData+3*sizeof(char), &num1, sizeof(int));
memcpy(sendData+sizeof(int), xystr.c_str(), xystr.size());
解码:
if(read(sock,recvbuf,sizeof(recvbuf))>0)
{
int len=0;
char *cint=(char *)&len;
(*cint)=(int)recvbuf[3];
(*(cint+1))=recvbuf[2];
(*(cint+2))=recvbuf[1];
(*(cint+3))=recvbuf[0];
for(int i=0;i<4;i++){printf("%d\n",recvbuf[i]);}
printf("数据长度:%d\n",len);
j=1;
}
当服务端向客户端用tcp不断的发送数据时,如果客户端突然断开,继续调用发送数据那么可能会发送 broken pipe 信号导致服务关闭,可以通过信号处理解决,但是也可以根据突然断开的时候发送数据返回int型-1,此时判断一下如果返回-1则终止发送就可以解决此问题
4.新写的功能是将一个数据在改变的时候使用socket发送,所以用了while循环,程序老是崩溃,崩溃语句随机,很头疼,领导指导了一下,当数据没有变化时死循环,会导致cpu占用率飙升,导致系统级关闭程序信号产生,在循环里加入了sleep后,就没有崩溃了。(需要注意的是,一定要自己new的自己delete!!!!!!)