recv返回的长度正确,但是缓冲区的数据不正确

xiaoji0507 2012-07-02 01:15:46
如题
char Stream[MAXLEN];
int len;
memset(Stream, '\0', MAXLEN);
len = recv(client, Stream, MAXLEN, 0);
printf("recieve len=%d,stream len=%d\n", len,strlen(Stream));
len的长度是正确的,但是Stream的长度小于len的长度。服务器发过来的数据是压缩过的,带有中文。uft-8编码。
MAXLEN 是1024 大于服务器返回的长度。

请问有神马原因可能导致此问题。有时候Stream的长度又是正确的。

是不是因为压缩的时候将某些字符变成了\0的原因。没有压缩的数据recv都是正常的。
...全文
357 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bezdly 2012-07-03
  • 打赏
  • 举报
回复
9楼的正解,睡觉时突然想起遇到过这问题,不能用strlen取长度,len才是实际长度
赵4老师 2012-07-03
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
zunceng 2012-07-03
  • 打赏
  • 举报
回复
看到utf-8我笑了 strlen能算utf8编码的字符串吗 字符中间必然有\0结束符
xiaoji0507 2012-07-03
  • 打赏
  • 举报
回复
一个包有可能是分两次发过来的。也有可能一次发送多个包。所以需要用长度来校验收到的数据是否是一个完整的数据包
[Quote=引用 12 楼 的回复:]
引用 11 楼 的回复:

那这个压缩后的数据长度该怎么取得呢?
引用 9 楼 的回复:
strlen是字符串长度, 压缩过的数据还是字符串吗?


数据的协议格式是这样的
数据长度;压缩标示;协议号;数据内容 其中压缩的是协议号和数据内容。

你这不都有通讯协议了, 每recv一次,就循环的拆包, 没有难度的.
[/Quote]
qq120848369 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

那这个压缩后的数据长度该怎么取得呢?
引用 9 楼 的回复:
strlen是字符串长度, 压缩过的数据还是字符串吗?
[/Quote]

数据的协议格式是这样的
数据长度;压缩标示;协议号;数据内容 其中压缩的是协议号和数据内容。

你这不都有通讯协议了, 每recv一次,就循环的拆包, 没有难度的.

xiaoji0507 2012-07-02
  • 打赏
  • 举报
回复
那这个压缩后的数据长度该怎么取得呢?
[Quote=引用 9 楼 的回复:]
strlen是字符串长度, 压缩过的数据还是字符串吗?
[/Quote]
xiaoji0507 2012-07-02
  • 打赏
  • 举报
回复
谢谢各位的回复。确实是高手,一下子就看出了问题的所在。现在已经确定了是我取缓冲区的数据流的长度问题。那现在的问题来了。压缩后的数据的长度该怎么取得了?数据的协议格式是这样的
数据长度;压缩标示;协议号;数据内容 其中压缩的是协议号和数据内容。由于发送的数据包有可能不是一个完整的数据包所以需要取得压缩内容的长度。各位有神马好的办法没?是用zlib压缩的。
qq120848369 2012-07-02
  • 打赏
  • 举报
回复
strlen是字符串长度, 压缩过的数据还是字符串吗?
恨天低 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

C/C++ code
void HexDump(char *buf,int len) {
int i,j,k;
char binstr[80];

for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%04x -",i);
sprintf(binst……
[/Quote]
用他给的函数输出字符串信息看看吧。
HandanXiaoliang 2012-07-02
  • 打赏
  • 举报
回复
有时候发送的内容并不一定全部都是有值的,或者说 可能存在'\0'值,strlen获取的长度,是把'\0'当做结束符的

这样说 对吗
bezdly 2012-07-02
  • 打赏
  • 举报
回复
len是不是每次接收到都固定长度?看你有时接收正常,异常的时候很可能是在包尾填充了0
bezdly 2012-07-02
  • 打赏
  • 举报
回复
是不是有填充字符???按接收到得len逐位打印出来,可能有填充0的,strlen能不能正确体现发送长度没测过
酱油党 2012-07-02
  • 打赏
  • 举报
回复
感觉可能存在传输错误,你传输用什么校验的?校验通过了吗?
赵4老师 2012-07-02
  • 打赏
  • 举报
回复
void HexDump(char *buf,int len) {
int i,j,k;
char binstr[80];

for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%04x -",i);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
图灵狗 2012-07-02
  • 打赏
  • 举报
回复
有可能服务器那边的程序压缩时传送的是原始数据包的长度,而不是压缩后的长度。
xiaoji0507 2012-07-02
  • 打赏
  • 举报
回复
自己顶,帮帮忙啊。。。

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧