我正在使用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之后是否需要清除缓冲区? 我想到的另一种方法是对数据包进行编号,只读取新数据包,但所有类型都是有限的,所以我希望可能有更简洁的方法。
我如何制作它以便客户端只读取一次接收到的数据?
答案 0 :(得分:3)
您是否在检查变量m
中的返回值?它很可能返回零或-1(因此没有读取任何字节),并且你一遍又一遍地重新打印相同的data
值,因为没有任何东西在修改它。
答案 1 :(得分:3)
log
常见问题。没有测试错误;不测试流的结尾;不使用长度。应该是:
printf("%s",data);
如果你不检查这些东西,你会永远旋转并在它们发生时打印垃圾。
我猜测数据存储在网卡上的缓冲区中
没有
在这种情况下,在1次读取后有一个清除缓冲区
阅读它清除它。你的问题出在其他地方。