2017-04-06 64 views
0

我有1個服務器和幾個(也許最多20個)客戶端。所有客戶端隨機發送UDP數據報。每個數據報都很短(約10B),但我必須確保來自每個客戶端的所有數據都能正確接收。什麼是從多個客戶端同步接收UDP數據的正確方法?

如果我讓所有的客戶端發送數據報給同一個端口,客戶端B發送它在數據報當服務器從客戶端的接收數據的準確時間,似乎服務器會從客戶端A.錯過數據

那麼做這項工作的正確方法是什麼?我是否需要爲20個客戶端中的每一個創建一個監聽器?

回答

0

在綁定UDP套接字到端口,網絡堆棧將分配一個緩衝器,用於有限數目的爲你進入的UDP分組,從而使(假設調用以相對及時的recv()),沒有傳入數據包應該丟失。

如果你想看到你的終端緩衝區的大小,你可以看看:

/proc/sys/net/core/rmem_default for recv 

/proc/sys/net/core/wmem_default for send 

我認爲Linux上的默認緩衝區大小爲131071B。通過加入這一行到/etc/sysctl.conf

sysctl -w net.core.rmem_max=26214400 

你也可以把它永久:

在Linux上,你可以(作爲root)改變UDP緩衝區大小(例如,以26214400):

net.core.rmem_max=26214400 

由於每個數據包只有10B,不應該是一個問題。

如果您仍然擔心數據包丟失,您可以在客戶端等待來自服務器的ACK或它將重新發送的情況下實現協議。許多協議都使用這種功能,但只有在時間允許的情況下才有可能。例如在流式傳輸數據中,它沒有用處,因爲沒有時間重新發送。

或考慮使用tcp(如果它是一個選項)

相關問題