如何在不堆叠旧数据的情况下接收UDP数据

时间:2013-03-26 09:01:45

标签: c network-programming

我通过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);

2 个答案:

答案 0 :(得分:2)

如果您的目标是实时,那么无法花费那么长时间来处理每个数据包。

如果你这样做,那么你将永远“迟到”,并且基本上丢弃发送给你的大部分数据,这似乎毫无意义和破坏。

但是,解决问题的一种方法可能是实现后台线程来为传入数据提供服务,并将其加时间戳并将其放入某种队列中。然后,您的“worker”线程可以从队列中轮询数据,并丢弃已经挂起太久的数据包。

不过,那不是真正的“实时”,而是......很奇怪。

答案 1 :(得分:0)

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

除了阅读之外,您还需要使用一些选择呼叫。在Win32(你的Win代码?)有很多选择。在Linux中,有pollselect和许多不变量。