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

时间:2016-09-01 02:08:16

标签: c linux sockets client-server

我正在尝试在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,但我不断为buffer和{{{{}}获得不同的输出1}}变量。

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

Output image

如您所见,这两个字符串是不同的。我试图模拟典型的TCP握手,我想确保这两个字符串是相同的,然后客户端将开始写或使用该服务器做某事。但我遇到了这个微不足道的问题。谁能告诉我如何解决它?我打算使用strcmp比较缓冲区和消息变量,但是现在看来,strcmp不会返回0,因为它们毕竟是不同的字符串。

1 个答案:

答案 0 :(得分:0)

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

详细说明:

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

您只发送四个字节,即指针的大小。你忽略了回报价值。它应该是

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);
  

我打算使用strcmp()

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