首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字缓冲区读取器的问题

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

Stack Overflow用户
提问于 2019-05-28 11:53:28
回答 1查看 65关注 0票数 0

我被分配了这段代码,应该是错误的,但我不知道这个函数应该做什么,更别提找出它是否有问题了……

我猜它应该逐行读取缓冲区,但我从来没有见过这样的情况

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

代码语言:javascript
复制
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;
        }
    }
}

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-28 15:10:46

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

好吧,那密码怎么了?

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

EOF -它被定义为-1,在本例中实际上没有任何意义,因为没有任何东西将您的data变量设置为EOF。唯一需要注意的是套接字流(recv文件)的结束。这里EOF使用的一个例子。请随时将(data == EOF)从状态中移除。

假设您定期接收所有内容,并且收到最后的输入和连接关闭,因此输入以下情况:

代码语言:javascript
复制
if ((result <= 0) || (data == EOF)){
    perror("Connection closed");
    exit(1);
}

这里的问题是,您将不会处理您的最后一行和程序将只是结束。不过,我可能错了,因为我不知道连接何时会被定期关闭。这里有一个次要的注释,结果等于0并不被认为是一个错误,而是一个常规的连接关闭(或者接收到一个0字节的数据报)。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56341687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档