在循环中读取套接字回复

时间:2010-02-21 03:11:00

标签: c++ sockets

我有:

char buf[320];

read(soc, buf, sizeof(buf));
//print buf;

然而,有时回复比320个字符大得多,所以我试图在循环中运行读取以避免占用太多的内存空间。我尝试过阅读(soc,buf,sizeof(buf)),但只会重复打印相同的前x个字符。如何打印不适合循环中前320个字符的剩余字符?

由于

2 个答案:

答案 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

这里的要点是:

  1. 始终检查read(2)返回的值
  2. 如果打印从套接字读取的字符串 - 始终手动将其终止。

希望这有帮助。