如何在客户端服务器模型中通过套接字发送和接收换行符?

How to send and receive newline character over sockets in a client server model?

我正在尝试学习 Linux 中的客户端服务器模型,我已经设置了两个 C 文件,即 server.c 和 client.c。这些是我似乎有问题的代码片段。

server.c 代码片段

char* message = "<query>\n";
write(client_socket_filedescriptor, message, sizeof(message));

client.c 代码片段

char* message = "<query>\n";
read(socket_filedescriptor, buffer, sizeof(buffer));
printf("%s", buffer);
printf("\n\n");
printf("%s", message);

现在,当我 运行 我的服务器然后当我 运行 我的客户端时,我希望 printf 语句打印与 <query>\n 相同的字符串,但我不断变得不同buffermessage 变量的输出。

当我 运行 客户端代码时,输​​出看起来有点像这样。

Output image

如您所见,这两个字符串是不同的。我正在尝试模拟典型的 TCP 握手,我想确保这两个字符串相同,然后客户端将开始写入或对该服务器执行某些操作。但我有这个微不足道的问题。谁能告诉我如何解决它?我计划使用 strcmp 来比较缓冲区和消息变量,但就目前而言,strcmp 不会 return 0 因为毕竟这些是不同的字符串。

您忽略了 return 由 read() 编辑的计数。它可以是 -1,表示错误,或者是零,表示流结束,或者是正数,表示接收到的字节数。您不能假设 read() 填充缓冲区,或者单个 send()write() 对应于单个 recv()read().

详细:

write(client_socket_filedescriptor, message, sizeof(message));

您只发送了四个字节,即指针的大小。而您忽略了 return 值。应该是

int count = write(client_socket_filedescriptor, message, strlen(message));
if (count == -1)
    perror("write"); // or better

char* message = "<query>\n";

read(socket_filedescriptor, buffer, sizeof(buffer));

应该是

int count = read(socket_filedescriptor, buffer, sizeof(buffer));
if (count == -1)
    perror("read"); // or better
else if (count == 0)
    ; // end of stream: the peer has disconnected: close the socket and stop reading
else

返回您的代码:

printf("%s", buffer);

应该是

printf("%.*s", count, buffer);

I plan to use strcmp()

您应该计划使用 strncmp(),上面的 count 作为长度参数。在任何情况下,你都不能假设输入以 null 结尾,除非你 (a) 确保你发送了 null,而你不是,并且 (b) 编写一个读取循环,当你读取它时停止。