套接字缓冲区读取器的问题

时间:2019-05-28 11:53:29

标签: c sockets buffer

已经为我分配了此代码以进行分配,其中应该有错误,但是我实际上无法弄清楚该函数应该做什么,不要介意它是否存在任何问题...

我猜想它应该逐行读取缓冲区,但是我从未见过如此做过

发送给该函数的缓冲区为空。

int read_line(int sock, char *buffer) {
    size_t length = 0;

    while (1) {
        char data;
        int result = recv(sock, &data, 1, 0);

        if ((result <= 0) || (data == EOF)){
            perror("Connection closed");
            exit(1);
        }

        buffer[length] = data;
        length++;

        if (length >= 2 && buffer[length-2] == '\r' && buffer[length-1] == '\n') {
            buffer[length-2] = '\0';
            return length;
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:1)

我要说的是,此功能的目的是从套接字流中读取以$var = $_GET['article']; if($var == 'one'){ header("Location: http://www.one.com/"); }else if ($var == 'two'){ header("Location: http://www.two.com/"); } 结尾的行,并将其作为字符串存储在char数组中,因此,\r\n(字符串终止符)的位置。

好的,那么代码有什么问题吗?

我将从输入参数\0开始-在函数内部您不知道其大小,因此您无法检查它是否超过其大小限制,否则可能导致缓冲区溢出。 因此,最好将缓冲区长度作为参数发送并检查每个接收到的字节是否可以存储。

EOF-它被定义为char *buffer,在这种情况下实际上没有任何意义,因为没有任何事情将-1变量设置为data。您唯一需要注意的是套接字流(recv documentation)的结尾。 hereEOF使用的一个例子。 随时从条件中删除EOF

比方说,您定期接收所有信息,并且您收到的最后输入内容和连接均已关闭,因此请输入以下情况:

(data == EOF)

这里的问题是,您将不会处理最后一行,并且程序只会结束。虽然,由于我不知道何时定期关闭连接,我在这里可能是错的。 还有一点需要注意的是,等于0的结果不会被视为错误,而是会定期关闭连接(或接收到0字节的数据报)。

我希望我什么都没错过。