我被分配了这段代码,应该是错误的,但我不知道这个函数应该做什么,更别提找出它是否有问题了……
我猜它应该逐行读取缓冲区,但我从来没有见过这样的情况
发送给函数的缓冲区为空。
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;
}
}
}提前感谢!
发布于 2019-05-28 15:10:46
我想说,这个函数的目的是从套接字流中读取以\r\n结尾的行,并将其作为字符串存储在char数组中,因此\0 (字符串终止字符)位置。
好吧,那密码怎么了?
我从输入参数char *buffer开始--在函数中,您不知道它的大小,所以不能检查它是否超过了大小限制,并且可能导致缓冲区溢出。因此,最好将缓冲区长度作为参数发送,并检查接收到的每个字节是否可以存储。
EOF -它被定义为-1,在本例中实际上没有任何意义,因为没有任何东西将您的data变量设置为EOF。唯一需要注意的是套接字流(recv文件)的结束。这里是EOF使用的一个例子。请随时将(data == EOF)从状态中移除。
假设您定期接收所有内容,并且收到最后的输入和连接关闭,因此输入以下情况:
if ((result <= 0) || (data == EOF)){
perror("Connection closed");
exit(1);
}这里的问题是,您将不会处理您的最后一行和程序将只是结束。不过,我可能错了,因为我不知道连接何时会被定期关闭。这里有一个次要的注释,结果等于0并不被认为是一个错误,而是一个常规的连接关闭(或者接收到一个0字节的数据报)。
我希望我没有错过任何东西。
https://stackoverflow.com/questions/56341687
复制相似问题