我正在Linux上編寫C++應用程序。我的應用程序有一個UDP服務器,它在某些事件中向客戶端發送數據。 UDP服務器還收到來自客戶端的一些反饋/確認。UDP服務器套接字緩衝區溢出
爲了實現這個應用程序,我使用了一個UDP套接字(例如int fdSocket
)來發送和接收來自所有客戶端的數據。我將這個socked綁定到端口8080,並將套接字設置爲NON_BLOCKING模式。
我創建了兩個線程。在一個線程中,我等待一些事件發生,如果發生事件,那麼我使用fdsocket向所有客戶端發送數據(在for循環中)。
在另一個線程中,我使用fdSocket
接收來自客戶端的數據(recvfrom()
)。這個線程計劃每4秒運行一次(即每4秒鐘會調用recvfrom()
從套接字緩衝區中檢索數據,因爲它處於非阻塞模式,所以如果沒有可用的UDP數據,recvfrom()
函數將立即返回,然後I會睡4秒)。
來自所有客戶端的UDP反饋/確認具有大小爲20字節的固定有效載荷。
現在我有兩個與此相關的實施問題:
- 它是正確的用於發送/接收UDP數據 與Mulitiple客戶同一插座?
- 如何查找UDP反饋/確認數據包的最大數量,我的應用程序可以在沒有UDP套接字緩衝區溢出的情況下處理(因爲我每4秒讀取一次,如果我在這4秒內接收到大量數據包,我可能會丟失一些數據包即ie 。,我需要找到我能安全處理的數據包/秒的速率)?
我嘗試使用函數調用getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
獲取我的套接字(fdsocket
)的Linux套接字緩衝區大小。從這個函數中我發現我的Socket緩衝區大小是110592.但是我不清楚這個數據將被存儲在這個套接字緩衝區中:它將只存儲UDP Payload還是整個UDP數據包或事件整個以太網數據包?我提到這個link有一些想法,但感到困惑。
目前我的代碼有點髒,我會在這裏清理併發布它。
以下是發佈此問題前提及的鏈接。
- Linux Networking
- UDP SentTo and Recvfrom Max Buffer Size
- UDP Socket Buffer Overflow Detection
- UDP broadcast and unicast through the same socket?
- Sending from the same UDP socket in multiple threads
- How to flush Input Buffer of an UDP Socket in C?
- How to find the socket buffer size of linux
- How do I get amount of queued data for UDP socket?
爲什麼只有每4秒?爲什麼不只是讓這個線程坐在一個'select()'調用等待數據? – Collin 2012-07-12 12:17:20
@Collin由於UDP不可靠,我們實現了以下機制。對於發送給客戶端的每個UDP數據包,我都希望從客戶端返回一個確認數據包(帶有固定字符串的簡單UDP數據包)。如果我沒有收到來自客戶端的確認數據包,那麼我將在4秒後再次發送數據包 – 2012-07-12 12:26:34
好吧,但是使用該設置,服務器即使在沒有數據包時也會丟失數據包。在客戶端讀取套接字之後發送數據包時會發生什麼?隨着網絡時間的推移,服務器會認爲即使存在,也不會有任何迴應。仍然沒有理由不立即迴應。您可以使用TCP或類似的東西來代替滾動自己的可靠性:http://udt.sourceforge.net/ – Collin 2012-07-12 12:40:20