2012-05-26 90 views
0

我一直在圍繞UDP進行定製以使其可靠。我有這個設計問題,我只有在我的整個程序準備就緒後纔開始實現,並開始將數據包從源發送到接收器。可靠的UDP實現設計問題

場景: 我創建了一個接收數據包的單線程。父節點執行數據包發送作業。由於這只是一個POC,所以我將緩衝區和公共數據結構保存爲全局指針,爲其分配內存。我正在使用互斥關注關鍵內存部分。

作爲可靠性的一部分,我發送一些控制數據包與數據包分開。在任何時候,客戶端都會發送數據包並從服務器接收控制包,而服務器將接收數據包併發送控制包。我已經使用單個套接字,因爲我的理解是發送& recv同時處理單個套接字和默認阻塞。

問題: 爲了測試目的,我發送了100個數據包,從源到數據包。不幸的是,服務器端的線程忙不停地接收數據包並將其存儲在緩衝區中。在父線程獲取上下文切換之前,服務器代碼不會將數據包傳遞給應用程序。這增加了整體通信中不可接受的延遲。

請幫我理解,這是什麼問題;可以改變什麼來改善性能?

由於提前,基達

+0

TCP可能比UDP更可靠。爲什麼你不能使用TCP/IP套接字? –

+0

要求適用於流式傳輸應用程序。 tcp將不太適合。 – KedarX

回答

1

由於您使用互斥體,當互斥報文後,在一個線程釋放被髮送,那麼其他線程應該消耗的數據包。也許你不會很快釋放互斥鎖。

或者,讓套接字的select()方法爲您處理unblock-on-receive。

+0

我鎖定並解鎖每個數據包的互斥鎖。它應該已經緩解了上下文? – KedarX

+0

是的,你可能在某個地方有bug。但是,如果你的套接字中的數據包具有特定的無效性,那麼select()將爲你做到這一點:http://rhoden.id.au/doc/sockets2.html –

+0

謝謝,這是有道理的。是否有可能保持單線程的相同體系結構,並且它是父級並仍然利用select?我在線程中接收和發送呼叫,並且只發送給父母。任何線索?謝謝。 – KedarX