2014-01-15 78 views
1

我不確定這是否是正確的地方要問,所以請原諒我,如果不是。TCP作爲連接協議問題

我正在寫計算機監控軟件,需要連接到服務器。服務器可能會發出相對緊急的消息,如聲音或取消警報,客戶端可能會發送有關計算機的數據,如屏幕截圖。客戶發送的數據在時間上並不太重要,但遲遲不會超過兩分鐘。

對於軟件來說,不需要設置端口轉發是非常重要的,並且假設互聯網連接將通過幾乎所有時間都具有NAT的無線路由器完成。

我的想法是從客戶端啓動TCP連接,並使用它來傳輸數據。理想情況下,我不會在沒有需要時發送數據,但我相信這是不可能的。現在每隔一段時間發送一次ping就會保持連接活躍,如果此程序一直在計算機上運行,​​它將使用何種帶寬?另外,是否有可能減少這些保活標題的大小?

在我開始設計通信和編程之前,這個連接計劃是否有缺陷?有更好的選擇嗎?

謝謝!

回答

2

1)您不需要發送'ping'數據來保持連接處於活動狀態,TCP堆棧會自動執行此操作;發送「ping」數據的一個原因是要檢測客戶端的連接關閉 - 通常只有在嘗試從套接字讀取/寫入時才發現有問題。可能有更改各種超時的方法,以便您可以更快地檢測到這種情況。

2)一般來說,雖然TCP提供了一個面向流的無錯信道,但它並不保證時效性,如果你在互聯網上使用它,它將變得更加難以預測。 3)對於這樣的應用程序(我希望你是出於道德目的) - 我會傾向於使用TCP,因爲你不想要一個客戶端收到一個數據包來提高警報但不知道的情況那個再次關閉它的人。

+3

除非您通過在套接字上啓用保持連接來告知TCP堆棧,否則TCP堆棧不會自動發送ping。它默認是禁用的。 – EJP

+0

不要擔心,所有的透明和道德(將在GPL下發布)。如果我正確理解了第一部分,我可以打開一個連接,離開它幾個小時,然後應該做些緊急的事情 - 比如警報 - 它可以立即訪問? – Jacob

+0

由於EJP指出您需要啓用啓用保持活動;是的,您可以連接並保持頻道打開,並在需要時發送數據,但是,如果在發送連接之前該發生什麼情況,該怎麼辦?最好的情況是消息會通過網絡上的可用延遲傳遞到另一端 - 最糟糕的情況是,延遲時間延長,延遲時間延長,超時,需要重新連接,或者另一端下降,你將不得不做出幾次嘗試,我會傾向於採取平均情況,但最好記住最壞的情況。 – wmercer