2012-11-07 64 views
2

我有一個移動和PC(服務器)之間的客戶端 - 服務器通信。 在通信中,我有四個套接字:其中兩個用於發送和接收數據,另外兩個用於某種保持活動,因爲我需要儘可能快地檢測斷開連接。優先插座通信

只要連接正常,數據就會毫無問題地傳播。但我想確定一些優先級,以確保活着(記住:兩個套接字)通道總是發送數據,除非服務器 - 客戶端之間的連接已經死亡。

我該如何做到這一點?

感謝您的任何幫助。

+0

由於網絡線路是共享的,您將碰到一些障礙點。您是否考慮過線程和線程優先級來幫助增加心臟跳動的頻率? –

回答

5

我會懷疑你的設置與四個套接字。

首先,單獨的連接用於發現遠程端死時沒有任何優勢,但事實上當「保持活動」連接斷開但「數據」連接仍然完好時引入競爭狀態。沒有活動時,通過相同的數據連接實施定期心跳。

然後在相同節點之間的兩個獨立數據連接競爭帶寬。網絡堆棧通常不會跨越連接邊界進行優化,因此您會得到兩倍的TCP開銷而無法獲得收益。通過相同的TCP連接實現數據交換 - 您將獲得更好的吞吐量(可能會以延遲增加較少爲代價,但只有良好的測量才能說明這一點)。

最後但並非最不重要的四個連接需要四個監聽TCP端口,因此可能在防火牆的某個地方有四個孔。減少到單個端口,該防火牆的管理員將永遠是你的朋友。

0

使用TCP進行傳輸時,只要您嘗試發送數據並且(TCP)連接中斷,TCP協議棧就會通知您。如果您同時控制服務器和客戶端代碼,則可能會在通過TCP進行數據傳輸之間實現心跳。

如果TCP在各個設備上的連接失敗檢測對於您的目的來說太慢,您可以在客戶端和服務器之間實現一些單包ping-pong方案,如「SNMP迴應請求」又名「ping」 - 或者SNMP不是一種選擇,可能來回發送UDP數據包將會有所斬獲。

在任何情況下,您都需要某種超時機制(已經在TCP堆棧中實現),這意味着檢測到斷開的連接將被延遲,延遲時間以超時持續時間爲界。