Recvfrom重新读取旧数据

时间:2016-05-31 12:22:04

标签: c++ c sockets recvfrom

我正在使用Berkeley C套接字在C / C ++中编写实时网络系统,该套接字基于时间间隔工作。每个tick,客户端程序将使用recvfrom()从套接字读取数据。

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

例如客户端(伪代码)

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

服务器:

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

然后客户端会继续打印"你好",而我只需要它打印一次。

这与此问题相似,recvfrom re-reading data on socket ,但我不太清楚答案,它似乎更能解决问题。

我猜测数据存储在netword卡上的缓冲区中,在这种情况下,在读取1之后是否需要清除缓冲区? 我想到的另一种方法是对数据包进行编号,只读取新数据包,但所有类型都是有限的,所以我希望可能有更简洁的方法。

我如何制作它以便客户端只读取一次接收到的数据?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

log

常见问题。没有测试错误;不测试流的结尾;不使用长度。应该是:

printf("%s",data);

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

  

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

没有

  

在这种情况下,在1次读取后有一个清除缓冲区

阅读它清除它。你的问题出在其他地方。