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都是正常的。
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都是正常的。
...全文
相关推荐
简单的缓冲区溢出源码
如果客户端发送的数据长度超过了`NAME_SIZE`,则会导致缓冲区溢出。虽然`recv`函数能够正确接收数据,但没有对实际接收到的数据长度进行检查,而是直接使用`bytes - 1`来终止字符串。
变长数据接收
需要正确处理`recv`函数返回的错误代码,如WSAEWOULDBLOCK表示资源暂时不可用,此时可能需要设置非阻塞模式或者使用select/poll/epoll等机制来等待数据就绪。
socket函数集.pdf
它们都接收数据到缓冲区buf,len指定缓冲区大小,flags通常设为0。如果recv返回值小于len,说明还有未接收的数据需要继续接收。8.
定长数据接收
因此,当两个应用程序通过socket进行通信时,它们需要约定数据的结构和长度,以便正确解析接收到的信息。定长数据接收就是基于这种约定,预先知道每次接收的数据大小,从而避免了数据解析的混乱。
loadrunnerSocket测试宣贯.pdf
- 缓冲区长度对于发送类型(send)只作参考,实际长度由内容决定;而对于接收类型(recv),LoadRunner会按配置长度读取数据。


