求CAsyncSocket下简单的分包算法思路

时间:2021-09-22 19:06:04
Rt,比如数据包每次都是    标志位 | 注释 | 内容    发的的包就形同   1|aaaa|xxxxxxxxxxxx    2|bbbb|xxxxxxxxxxxxxx

这样接收端的 OnReceive()怎么处理?如果有粘包情况,前面的包分出来,后半段的数据是自己先保存掉还是丢弃掉重新等触发OnReceive()去 socket.receive()获得数据?希望有伪代码提示下,当然可能发包格式不好,需要改进也可提醒下该怎么该

6 个解决方案

#1


协议的包尾部分 呢?

#2


需要在发送时制定包格式的时候,指定一下包的长度
比如这样的包格式

包长度|数据1|数据2|数据3|...|CRC 校验码 
这样在接收的时候就可以知道这个包是否正确接收啦

#3


我一般是这么做的
首先定义包结构:
typedef struct _xxdata {
int packetlen;      //表示这个包的长度,包括自己的4个字节
int label;
char demo[100];     
char sdata[1];
}xxdata, *pxxdata;

接收数据:
int datalen;
pxxdata rdata;
int recvlen1, recvlen2 = 0;
recvlen1 = recv(s, &data, sizeof(int), 0); //先接收4个字节, 以得到包的长度;
rdata = (pxxdata)malloc(datalen);
memset(rdata, 0 , datalen);
rdata->packetlen = datalen;
recvlen2 += recvlen1
while(recvlen2<datalen){
    recvlen1 = recv(s, (char *)rdata + recvlen2, datalen - recvlen2);
    recvlen2 += recvlen1;
}





#4


跟2楼说的是一个意思

#5


引用 1 楼 zhouzhangkui 的回复:
协议的包尾部分 呢?

包尾写点什么。。。。校验码?

引用
我一般是这么做的
首先定义包结构:

CAsyncSocket类实现的时候好像是有数据来会OnReceive(),在这函数里面调用socket.receive(),假设先按读出包头获得数据长度,再按数据长度取出余下的部分,该次receive就算结束?发生粘包情况下,缓冲区后面的包在下次OnReceive()里取?

#6


引用 5 楼 kemee 的回复:
引用 1 楼 zhouzhangkui 的回复:
协议的包尾部分 呢?

包尾写点什么。。。。校验码?


引用我一般是这么做的
首先定义包结构:
CAsyncSocket类实现的时候好像是有数据来会OnReceive(),在这函数里面调用socket.receive(),假设先按读出包头获得数据长度,再按数据长度取出余下的部分,该次receive就算结束?发生粘包情况下,缓冲区后……


1.用socket.receive() 替换recv就可以了
2.是的
3.发生粘包的情况,在下一次OnReceive里接收

#1


协议的包尾部分 呢?

#2


需要在发送时制定包格式的时候,指定一下包的长度
比如这样的包格式

包长度|数据1|数据2|数据3|...|CRC 校验码 
这样在接收的时候就可以知道这个包是否正确接收啦

#3


我一般是这么做的
首先定义包结构:
typedef struct _xxdata {
int packetlen;      //表示这个包的长度,包括自己的4个字节
int label;
char demo[100];     
char sdata[1];
}xxdata, *pxxdata;

接收数据:
int datalen;
pxxdata rdata;
int recvlen1, recvlen2 = 0;
recvlen1 = recv(s, &data, sizeof(int), 0); //先接收4个字节, 以得到包的长度;
rdata = (pxxdata)malloc(datalen);
memset(rdata, 0 , datalen);
rdata->packetlen = datalen;
recvlen2 += recvlen1
while(recvlen2<datalen){
    recvlen1 = recv(s, (char *)rdata + recvlen2, datalen - recvlen2);
    recvlen2 += recvlen1;
}





#4


跟2楼说的是一个意思

#5


引用 1 楼 zhouzhangkui 的回复:
协议的包尾部分 呢?

包尾写点什么。。。。校验码?

引用
我一般是这么做的
首先定义包结构:

CAsyncSocket类实现的时候好像是有数据来会OnReceive(),在这函数里面调用socket.receive(),假设先按读出包头获得数据长度,再按数据长度取出余下的部分,该次receive就算结束?发生粘包情况下,缓冲区后面的包在下次OnReceive()里取?

#6


引用 5 楼 kemee 的回复:
引用 1 楼 zhouzhangkui 的回复:
协议的包尾部分 呢?

包尾写点什么。。。。校验码?


引用我一般是这么做的
首先定义包结构:
CAsyncSocket类实现的时候好像是有数据来会OnReceive(),在这函数里面调用socket.receive(),假设先按读出包头获得数据长度,再按数据长度取出余下的部分,该次receive就算结束?发生粘包情况下,缓冲区后……


1.用socket.receive() 替换recv就可以了
2.是的
3.发生粘包的情况,在下一次OnReceive里接收