代码之家  ›  专栏  ›  技术社区  ›  ParityB1t

从重新读取旧数据中恢复

  •  1
  • ParityB1t  · 技术社区  · 10 年前

    我正在用C/C++语言用Berkeley C套接字编程一个实时网络系统,该套接字基于时间间隔。每次勾选,客户端程序都会使用recvfrom()从套接字中读取数据。

    问题是,如果服务器没有发送任何数据,客户端将读取在套接字上发送的最后一个数据。

    例如客户端(伪代码)

    while (true)
    {
       if (time_to_update())
       {
          int n = recvfrom(data,...);
          printf("%s",data);
       }
    }
    

    和服务器:

    int main()
    {
       int m = recvfrom(data,...);
       int n = sendto(...,"hello");
    }
    

    然后客户会继续打印“hello”,而我只需要打印一次。

    这与这个问题类似, recvfrom re-reading data on socket ,但我不太理解答案,它似乎更普遍地解决了问题。

    我猜数据存储在网卡上的缓冲区中,在这种情况下,在读取1次后是否有清除缓冲区的方法? 我想到的另一种方法是给数据包编号,只读取新的数据包,但所有类型都是有限的,所以我希望有一种更干净的方法。

    如何使客户端只读取一次接收到的数据?

    2 回复  |  直到 9 年前
        1
  •  4
  •   user207421    10 年前
    printf("%s",data);
    

    常见问题。未测试错误;未测试流结束;不使用长度。应该是:

    if (n < 0)
    {
        perror("recv");  // or better
        break;
    }
    else if (n == 0)
        break; // peer has disconnected 
    else
        printf("%.*s", n, data);
    

    如果你不检查这些东西,你将永远旋转,并在它们发生时打印垃圾。

    我猜数据存储在网卡上的缓冲区中

    不

    在这种情况下,读取1次后是否有清除缓冲区的方法

    阅读它可以清除它。你的问题在别处。

        2
  •  3
  •   Smeeheey    10 年前

    是否检查变量中的返回值 m ? 它很可能返回零或-1(因此没有读取字节),并且您继续重新打印相同的值 data 一遍又一遍,因为没有任何东西在改变它。