Recvfrom 重新读取旧数据

Recvfrom re-reading old data

我正在使用 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");
}

然后客户端会一直打印"hello",而我只需要打印一次

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

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

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

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

printf("%s",data);

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

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

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

I'm guessing the data is stored in a buffer on the netword card

没有

in which case is there a away to clear the buffer after 1 read

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