2013-03-26 51 views
2

我通過UDP協議從一個c-節目接收I過程的字符串,並以我的函數使用它的數據時,將數據發送到另一如何收到UDP數據而不堆疊舊數據

, 問題是如果由於我的函數需要更多時間來完成,如果我沒有時間來接收新數據,數據將會堆疊,然後我將不得不處理舊數據而不是處理最近的數據,這是我的實際目標實時處理

任何人都可以幫助我嗎?

這是我的接收代碼:

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

+1,我想寫的完全一樣。 – 2013-03-26 09:16:36

+0

謝謝,我其實是在研究多線程,但由於我從來沒有采取過這種方法,我想看看是否還有什麼我可以做丟棄舊包,順便說一下,我的實時並不是真的,但我有儘可能準確,因爲我正在控制步進電機,再次感謝 – Elie 2013-03-26 09:16:45

+0

當使用udp時,有沒有辦法清除或沖洗輸入緩衝區? – Elie 2013-03-26 09:58:26

0

如果將套接字更改爲非阻塞模式,則可以一次執行多個讀取操作,並丟棄除最後一條消息之外的所有數據。

除了閱讀外,您還需要使用一些select調用。在Win32中(你的代碼是Win?)有很多選項。在Linux中,有poll,select和許多不變式。

+0

謝謝,我實際上使用debian編碼 – Elie 2013-03-26 10:34:18