这样接收端的 OnReceive()怎么处理?如果有粘包情况,前面的包分出来,后半段的数据是自己先保存掉还是丢弃掉重新等触发OnReceive()去 socket.receive()获得数据?希望有伪代码提示下,当然可能发包格式不好,需要改进也可提醒下该怎么该
6 个解决方案
#1
协议的包尾部分 呢?
#2
需要在发送时制定包格式的时候,指定一下包的长度
比如这样的包格式
包长度|数据1|数据2|数据3|...|CRC 校验码
这样在接收的时候就可以知道这个包是否正确接收啦
比如这样的包格式
包长度|数据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;
}
首先定义包结构:
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
包尾写点什么。。。。校验码?
CAsyncSocket类实现的时候好像是有数据来会OnReceive(),在这函数里面调用socket.receive(),假设先按读出包头获得数据长度,再按数据长度取出余下的部分,该次receive就算结束?发生粘包情况下,缓冲区后面的包在下次OnReceive()里取?
#6
1.用socket.receive() 替换recv就可以了
2.是的
3.发生粘包的情况,在下一次OnReceive里接收
#1
协议的包尾部分 呢?
#2
需要在发送时制定包格式的时候,指定一下包的长度
比如这样的包格式
包长度|数据1|数据2|数据3|...|CRC 校验码
这样在接收的时候就可以知道这个包是否正确接收啦
比如这样的包格式
包长度|数据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;
}
首先定义包结构:
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
包尾写点什么。。。。校验码?
CAsyncSocket类实现的时候好像是有数据来会OnReceive(),在这函数里面调用socket.receive(),假设先按读出包头获得数据长度,再按数据长度取出余下的部分,该次receive就算结束?发生粘包情况下,缓冲区后面的包在下次OnReceive()里取?
#6
1.用socket.receive() 替换recv就可以了
2.是的
3.发生粘包的情况,在下一次OnReceive里接收