2

我正在通过 UDP 协议将数据从一个 c 程序发送到另一个

接收数据时,我处理字符串并在我的函数中使用它,问题是如果我没有时间接收新数据,因为我的函数需要更多时间才能完成,数据将堆叠,然后我将拥有处理旧数据而不是处理最近的数据,这是我实时处理的实际目标

谁能帮我这个 ?

这是我的接收代码:

addr_len = sizeof their_addr;
if ((numbytes = recvfrom(sockfd, ubuf, 6 , 0,(struct sockaddr *)&their_addr, &addr_len)) == -1) 
{
    perror("recvfrom");
    //exit(1);
}

inet_ntop(their_addr.ss_family,get_in_addr((struct sockaddr *)&their_addr),s, sizeof s);

//printf("listener: packet is %d bytes long\n", numbytes);

ubuf[numbytes] = '\0';
printf("listener: packet contains \"%s\"\n", ubuf);
4

2 回答 2

2

如果您的目标是实时,那么您不能在处理每个数据包上花费那么长时间。

如果这样做,那么您将始终“迟到”,并且基本上会丢弃发送给您的大部分数据,这似乎毫无意义且损坏。

尽管如此,解决它的一种方法可能是实现一个后台线程来为传入的数据提供服务,并将其打上时间戳并将其放入某种队列中。然后,您的“工作”线程可以从队列中轮询数据,并丢弃已经挂起太久的数据包。

尽管如此,这并不是真正的“实时”,它......很奇怪。

于 2013-03-26T09:08:32.087 回答
0

如果将套接字更改为非阻塞模式,则可以一次执行多次读取并丢弃除最后一条消息之外的所有数据。

除了阅读之外,您还需要使用一些选择调用。在 Win32 中(您的 Win 代码是吗?)有很多选项。poll在 Linux 中,有select和许多不变量。

于 2013-03-26T09:57:38.427 回答