我正在尝试在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}}变量。
当我运行客户端代码时,输出看起来有点像这样。
如您所见,这两个字符串是不同的。我试图模拟典型的TCP握手,我想确保这两个字符串是相同的,然后客户端将开始写或使用该服务器做某事。但我遇到了这个微不足道的问题。谁能告诉我如何解决它?我打算使用strcmp比较缓冲区和消息变量,但是现在看来,strcmp不会返回0,因为它们毕竟是不同的字符串。
答案 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)写一个读取循环,当你读它时停止。