在 C 的简单聊天中使用 read() 读取的神秘字符数?
Mysterious number of chars read with read() in simple chat in C?
我用 C 语言编写了一个简单的 TCP 聊天。服务器的工作是从客户端接收消息并以相反的顺序将它们发回。结果应如下所示:
客户:"Hello"
服务器:"olleH"
当我将"strlen()"应用到"olleH"时,返回的长度不是5,而是7。7也是read()函数返回的值。我在这里错过了什么?我知道 char 数组以 '\0' 结尾,但这并不能解释多出来的 2 个字符。
循环应该在收到消息 "FINISH" 后结束。因此,我使用 strcmp() 将收到的消息与字符数组 "FINISH" 进行比较。由于上述原因,它们从未被认为是相同的。我收到一条包含 2 个额外字符的消息。我试过将收到的消息与 "FINISH__" 进行比较(将“_”解释为空白 space),但它也不起作用。
do{
bzero(buffer, 1000);
n = read(client_socket, buffer, 1000);
if (n<0){
error("ERROR reading socket");
}
invert(buffer, inv); //inv is a buffer that stores the inverted array
n = write(client_socket, inv, n);
if (n<0){
error("ERROR writing in socket");
}
}while (strcmp(buffer, "FINISH\n") != 0);
感谢您的帮助。
这个 post 可能有用:
C Socket Write adding extra characters
当您从 read 接收到 'n' 时,它会为您提供读取的字节数的大小,而不是读取的文本的字符串长度。
你正在写 'n' 在你的写命令中。
我想 'Hello' 的长度应该是 5,它的大小是 7。
这或许可以解释尺寸 7。
使用 strlen(buffer) 或等效项检查您的长度。
从服务器发送数据时,您必须输入 Hello
,然后按 ENTER
键,这只不过是 \r\n
。所以客户正在阅读它作为 Hello\r\n
。因此,您必须额外获得两个字符。我希望这个对你有用。您可以通过循环输入 buffer
来检查这一点,并检查那里是否存在 \r\n
。
我用 C 语言编写了一个简单的 TCP 聊天。服务器的工作是从客户端接收消息并以相反的顺序将它们发回。结果应如下所示:
客户:"Hello"
服务器:"olleH"
当我将"strlen()"应用到"olleH"时,返回的长度不是5,而是7。7也是read()函数返回的值。我在这里错过了什么?我知道 char 数组以 '\0' 结尾,但这并不能解释多出来的 2 个字符。
循环应该在收到消息 "FINISH" 后结束。因此,我使用 strcmp() 将收到的消息与字符数组 "FINISH" 进行比较。由于上述原因,它们从未被认为是相同的。我收到一条包含 2 个额外字符的消息。我试过将收到的消息与 "FINISH__" 进行比较(将“_”解释为空白 space),但它也不起作用。
do{
bzero(buffer, 1000);
n = read(client_socket, buffer, 1000);
if (n<0){
error("ERROR reading socket");
}
invert(buffer, inv); //inv is a buffer that stores the inverted array
n = write(client_socket, inv, n);
if (n<0){
error("ERROR writing in socket");
}
}while (strcmp(buffer, "FINISH\n") != 0);
感谢您的帮助。
这个 post 可能有用: C Socket Write adding extra characters
当您从 read 接收到 'n' 时,它会为您提供读取的字节数的大小,而不是读取的文本的字符串长度。 你正在写 'n' 在你的写命令中。 我想 'Hello' 的长度应该是 5,它的大小是 7。 这或许可以解释尺寸 7。 使用 strlen(buffer) 或等效项检查您的长度。
从服务器发送数据时,您必须输入 Hello
,然后按 ENTER
键,这只不过是 \r\n
。所以客户正在阅读它作为 Hello\r\n
。因此,您必须额外获得两个字符。我希望这个对你有用。您可以通过循环输入 buffer
来检查这一点,并检查那里是否存在 \r\n
。