我有:
char buf[320];
read(soc, buf, sizeof(buf));
//print buf;
然而,有时回复比320个字符大得多,所以我试图在循环中运行读取以避免占用太多的内存空间。我尝试过阅读(soc,buf,sizeof(buf)),但只会重复打印相同的前x个字符。如何打印不适合循环中前320个字符的剩余字符?
由于
答案 0 :(得分:2)
将循环更改为:
while(1)
{
int numread;
if ((numread = read(soc, buf, sizeof(buf) - 1)) == -1)
{
perror("read");
exit(1);
}
if (numread == 0)
break;
buf[numread] = '\0';
printf("Reply: %s\n", buf);
}
出于尼古拉所说的原因。
答案 1 :(得分:1)
每次调用read( s, buf, buf_size )
时,内核都会将min( buf_size, bytes_available )
复制到buf
,其中bytes_available
是已经收到并在套接字接收缓冲区中等待的字节数。 read(2)
系统调用返回放入应用程序缓冲区的字节数,或者出错时-1
,或0
发出EOF
信号,即close(2)
发送端的套接字。因此,当您重用缓冲区时,只有部分缓冲区可能会被新数据覆盖。另请注意,-1
在C和C ++中的计算结果为true
。这可能是你遇到的情况。
printf(3)
期望%s
格式说明符的以零结尾的字符串。从套接字读取的字节可能不包含'\0'
字节,因此允许printf(3)
打印,直到它在某处找到零为止。这可能会导致buffer overrun。
这里的要点是:
read(2)
返回的值
希望这有帮助。