首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-07-15 
recv返回的长度正确,但是缓冲区的数据不正确如题char Stream[MAXLEN]int lenmemset(Stream, \0, MAXLE

recv返回的长度正确,但是缓冲区的数据不正确
如题
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都是正常的。

[解决办法]

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(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);    }}
[解决办法]
感觉可能存在传输错误,你传输用什么校验的?校验通过了吗?
[解决办法]
是不是有填充字符???按接收到得len逐位打印出来,可能有填充0的,strlen能不能正确体现发送长度没测过
[解决办法]
有时候发送的内容并不一定全部都是有值的,或者说 可能存在'\0'值,strlen获取的长度,是把'\0'当做结束符的

这样说 对吗
[解决办法]
strlen是字符串长度, 压缩过的数据还是字符串吗?
[解决办法]
探讨

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

[解决办法]
9楼的正解,睡觉时突然想起遇到过这问题,不能用strlen取长度,len才是实际长度
[解决办法]
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

热点排行