C:tcp recv没有清除旧数据

时间:2015-04-08 04:29:12

标签: c sockets

我在server.c中有以下代码

while (1) {
    char msg[1024];
    recv(fd, msg, 1024, 0);
}

从客户端,首先,我发送了#34; hello world"。

然后我收到了#34;你好世界"在服务器中。

然后我发送了" hexx"到服务器。

但我收到了" hexxo world"在服务器上。

似乎msg没有完全清除。

请让我知道我做错了什么。

干杯。

3 个答案:

答案 0 :(得分:3)

您正在为消息分配1024个字节,并且永远不会将该数据归零。你只是一遍又一遍地读入同一个缓冲区。首先在第二遍中读取“hello world”,你将“hexx”放在相同的起始地址中,产生“hexxo world”

正如DoxyLover所提到的,你可以null终止新读取的字符串并获得你想要的东西。

答案 1 :(得分:1)

read()不会终止缓冲区。因此,您将看到缓冲区中遗留的旧数据。

你想要的是:

while (1) {
    char msg[1024];
    ssize_t n = recv(fd, msg, 1023, 0);
    if (n >= 0)
        msg[n] = '\0';
}

请注意,我将读取限制为小于缓冲区大小的值,以便为空字节留出空间。显然,这只适用于文本数据。对于二进制数据,您需要记录read()的返回值,并在处理缓冲区时将其用作字节计数。例如,要将数据从一个套接字复制到另一个套接字:

while (1) {
    char msg[1024];
    ssize_t n = recv(fd, msg, 1024, 0);
    if (n > 0)
        send(second_fd, msg, n, 0);
}

所有这些都非常简单 - 您需要进行错误检查,检查read()的返回以确保收到任何字节,检查send()的返回以确保所有字节都已发送等等。

答案 2 :(得分:0)

  

tcp recv不清除旧数据

谁说会呢?不是说它应该是必要的。您忽略recv().返回的计数。在致电recv(),后,有三种可能性:

  1. 返回值-1:错误;致电perror()
  2. 返回值0:流结束:关闭套接字并退出读取循环。
  3. 返回值为正:您已经在缓冲区中收到了这么多字节,并且您不应该假设超出该计数的任何数据都有效。
  4. 目前你没有正确地做这些事情。