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

标签 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;
        }
    }
}

提前致谢!

最佳答案

我会说这个函数的目的是从套接字流中读取以 \r\n 结尾的行并将其作为字符串存储在 char 数组中,因此 \0(字符串终止字符)放置。

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

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

EOF - 它被定义为 -1 并且在这种情况下实际上没有任何意义,因为没有任何东西会将您的 data 变量设置为 EOF 。您唯一需要注意的是套接字流的结尾(recv documentation)。和 hereEOF 用法的示例。 随意从条件中删除 (data == EOF)

假设您定期接收所有内容并且您收到最后一次输入并且连接关闭,因此您进入这种情况:

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

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

我希望我没有错过任何东西。

关于c - 套接字缓冲区读取器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56341687/

相关文章:

c++ - 独立于操作系统的清除缓冲区

c - 我在方程式中输入一个 double 整数,但一直得到 0

c - 在 C 中使用 getaddrinfo() 的 Unix 套接字

c - arm-none-eabi-gcc C 指针

c - 在无限循环中通过套接字进行客户端服务器通信

node.js - 检测从缓冲区读取的部分或不完整的字符

C++ 'map' 数字范围

c - 为什么 Apache MPM prefork.c 使用互斥量来保护 accept()?

c# - 不同网络中两个应用程序之间的命令

ios - 从相机缓冲区 iOS 转换图像。使用 AVFoundation 捕获静止图像