我已经得到了这个代码用于作业,它应该有错误,但我实际上无法弄清楚这个函数应该做什么,更不用说弄清楚它是否有任何问题......
我猜它应该是逐行读取缓冲区,但我以前从未见过这样做
发送给函数的缓冲区是空的。
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)。和 here是 EOF
用法的示例。
随意从条件中删除 (data == EOF)
。
假设您定期接收所有内容并且您收到最后一次输入并且连接关闭,因此您进入这种情况:
if ((result <= 0) || (data == EOF)){
perror("Connection closed");
exit(1);
}
这里的问题是您不会处理最后一行,程序就会结束。虽然,我在这里可能是错的,因为我不知道连接何时会定期关闭。 这里有一点要注意,等于 0 的结果不被视为错误,而是常规连接关闭(或收到 0 字节数据报)。
我希望我没有错过任何东西。
关于c - 套接字缓冲区读取器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56341687/