[英]reading buffer from socket
我正在用c编写简单的服务器/客户端,其中服务器临时存储来自客户端的消息,并在客户端请求时检索它。
问题是当客户端从服务器接收消息时,缓冲区有点奇怪。 我所做的全部与从服务器接收到的一样多,并且将其打印在屏幕上,但是不知何故,缓冲区被覆盖的程度超过了缓冲区的最大大小
在客户中
while((byteRead = recv(ssock, buffer, MAXBUF, 0)) > 0)
{
if(byteRead <= 0)
break;
printf("%s", buffer);
}
其中MAXBUF是256。它包含一些垃圾,因此我检查了缓冲区中的字符串大小,并且令人惊讶地
printf("%d READ vs %d buffer strlen \n", byteRead, strlen(buffer))
告诉我byteRead是256,但是缓冲区的字符串长度是262。
任何想法??
服务器端的ps,它正确读取文件并将其发送到套接字。
recv
不会在字符串的末尾放置一个空终止符(而printf
%s
假定存在一个终止符)。
您必须使用byteRead
来确定字符串的长度。 如果要使用类似printf
,请添加一个空终止符,但即使在最大大小的读取时,也要确保缓冲区具有printf
的空间。
这里的问题是buffer
不是由recv()
终止的。 实际上, recv
仅将原始套接字数据放入缓冲区。 如果它接收256个字节的数据,则其后的内容可能是空字符(例如,在您的服务器上),也可能是其他字符(在您的客户端上)。 这是程序执行的产物,而不是您如何编程的产物。
解决此问题的最简单,最快的方法:
MAXBUF + 1
buffer
。 +1将代表一个额外的NULL字符。 printf
之前,立即在buffer[bytesRead]
处添加一个空字符。 所以说:
buffer = malloc((MAXBUF + 1) * sizeof(char)); // NEW
while((byteRead = recv(ssock, buffer, MAXBUF, 0)) > 0)
{
if(byteRead <= 0)
break;
else {
buffer[bytesRead] = '\0'; // NEW
printf("%s", buffer);
}
}
是。
像传统的C字符串一样,strlen()查找最接近的NULL终止符。
recv()与空终止符无关,也不会加一个。 因此,strlen调用是错误的,甚至可能因未经授权的读取而使程序崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.