从套接字读取正在接受一些胡言乱语

时间:2015-11-16 01:29:43

标签: c

这个错误很可能是一个比使用套接字更常见的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.

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

1 个答案:

答案 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的任何代码并且不使用已建立的协议之前,请花时间为您计划实施的协议编写协议规范。这将有助于您避免错过必要的步骤。