这个错误很可能是一个比使用套接字更常见的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.
奇怪的乱码会根据正在运行的特定服务器实例而有所不同,但在此过程结束之前,每次出现的乱码都是相同的。
答案 0 :(得分:-1)
客户端实质上是向服务器发送消息,服务器终端打印正在发送的内容。
这意味着服务器中的某个地方必须有代码才能接收消息。这也意味着你的协议规范必须在某处定义“消息”是什么,否则就不可能编写代码来接收它。
while (read(newsockfd, &buffer, 256) > 0)
printf("%s", buffer);
您调用了TCP read
函数,该函数从TCP字节流中读取一些字节。然后你扔掉了数据的长度,所以你不知道你读了多少数据。然后将它传递给期望C样式字符串的函数。接收消息的代码在哪里?
TCP是一种字节流协议。它发送和接收字节流。如果你想在它上面建立一个消息协议,那么你可以发送和接收消息。但你必须做三件事:
1)定义“消息”是什么。 (例如,“一个零或更多字节的序列,不包括换行,返回或零字节,由换行符分隔”。)
2)编写代码以发送消息。
3)编写代码以接收消息。
我们不知道你是否做了第1步或第2步,但你肯定没有做过3.所以这段代码只能运气或魔术。
您可能非常有助于阅读在TCP之上分层的协议的一些规范,例如HTTP,IRC或SMTP。然后,在编写使用TCP的任何代码并且不使用已建立的协议之前,请花时间为您计划实施的协议编写协议规范。这将有助于您避免错过必要的步骤。