【发布时间】:2016-05-31 12:22:03
【问题描述】:
我正在使用 Berkeley C 套接字用 C/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 次后是否需要清除缓冲区? 我想到的另一种方法是对数据包进行编号并仅读取新的数据包,但所有类型都是有限的,所以我希望可能有一种更清洁的方法。
我将如何做到让客户端只读取一次接收到的数据?
【问题讨论】:
-
很可能是因为您的套接字处于非阻塞模式,您没有检查来自
recvfrom()的返回值,并且您的代码最终只是读取了您正在使用的读取缓冲区的相同内容. -
你为什么要根据时钟滴答声调用
recvfrom(),而不是在select()或(e)poll()告诉你数据正在等待读取时进行读取? -
我才刚刚开始学习套接字编程,我发现的教程使用了较旧的约定,但最终我会更新我的知识。