gpt4 book ai didi

c - 从套接字读取时收到一些乱码

转载 作者:行者123 更新时间:2023-11-30 18:12:36 24 4
gpt4 key购买 nike

这个错误很可能是一个更常见的 C 错误,而不是与套接字的使用相关的错误,但这是我所遇到的错误

我有我一直在开发的服务器代码和客户端代码。客户端本质上是向服务器发送消息,服务器终端打印发送的所有内容。对于这种情况,除非有要求,否则我不会包含 client.c 文件,因为它不是问题所在。

来自 server.c:

while(1)
{
if ((newsockfd=accept(sockfd, (struct sockaddr*)&cli_addr, &clilen)) < 0)
{
perror("accept");
exit(0);
}

usleep(2000);

printf("Server received: ");

while (read(newsockfd, &buffer, 256) > 0)
printf("%s", buffer);

printf("\nServer: Message end. Waiting for next connection.\n");
}

接收输入时得到的输出如下所示:

Server received: *first message from client*
*weird gibberish* *second message from client*
*weird gibberish* *third message from client*

...

Server: Message end. Waiting for next connection.

奇怪的乱码根据正在运行的特定服务器实例而有所不同,但在该过程结束之前,乱码每次出现都是相同的。

最佳答案

The client essentially sends messages to the server and the server terminal prints whatever was being sent.

这意味着服务器中的某个地方必须有代码来接收消息。这也意味着您的协议(protocol)规范必须在某处定义什么是“消息”,否则无法编写代码来接收消息。

while (read(newsockfd, &buffer, 256) > 0)
printf("%s", buffer);

您调用了 TCP read 函数,该函数从 TCP 字节流中读取一些字节。然后你扔掉了数据的长度,所以你不知道你读了多少数据。然后将其传递给需要 C 样式字符串的函数。接收消息的代码在哪里?

TCP 是一种字节流协议(protocol)。它发送和接收字节流。如果您想在其之上制定消息协议(protocol),以便可以发送和接收消息,也可以。但你必须做到三件事:

1) 定义什么是“消息”。 (例如,“零个或多个字节的序列,不包括换行符、返回值或由换行符分隔的零字节”。)

2)编写代码发送消息。

3)编写代码来接收消息。

我们无法判断您是否执行了第 1 步或第 2 步,但您肯定没有执行第 3 步。因此,这段代码只能靠运气或魔法才能发挥作用。

阅读 TCP 之上的协议(protocol)(例如 HTTP、IRC 或 SMTP)的一些规范可能会对您非常有帮助。然后,在编写任何使用 TCP 且不使用已建立协议(protocol)的代码之前,请花时间为您计划实现的协议(protocol)编写协议(protocol)规范。这将帮助您避免错过重要步骤。

关于c - 从套接字读取时收到一些乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33727233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com