如何在客户端服务器模型中通过套接字发送和接收换行符?
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
相同的字符串,但我不断变得不同buffer
和 message
变量的输出。
当我 运行 客户端代码时,输出看起来有点像这样。
如您所见,这两个字符串是不同的。我正在尝试模拟典型的 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) 编写一个读取循环,当你读取它时停止。
我正在尝试学习 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
和 message
变量的输出。
当我 运行 客户端代码时,输出看起来有点像这样。
如您所见,这两个字符串是不同的。我正在尝试模拟典型的 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) 编写一个读取循环,当你读取它时停止。