簡體   English   中英

TidTCPClient 與 TidTCPServer 保持連接狀態多長時間沒有包通信

[英]How long does TidTCPClient keep connection status with TidTCPServer without packet communication

我正在使用 Delphi 中的 Indy TCP 組件制作服務器-客戶端通信系統。

客戶端和服務端組件一旦連接好,如果長時間沒有包通信,這個連接還能保持多久?

如果我的想法是錯誤的,那么是否需要任何信號包通信來防止斷開連接?

在 TCP 級別,一旦建立連接就不需要發送數據包。 如果您沒有要發送的消息,則無需發送任何內容。 理論上,連接可以無限期地保持打開狀態。

但是,在實踐中,可能存在影響空閑連接(防火牆/路由器規則等)的網絡級別的要求。 為了解決這個問題,客戶端和/或服務器應該定期告訴對方連接在空閑期間故意保持打開狀態(無論如何這只是良好的通信設計)。

您可以將顯式消息添加到您的通信協議中,這只是您根據需要在計時器上來回發送消息的額外編碼問題。 如果您發送消息,但在合理的時間內沒有得到回復,您可以關閉兩端的連接。

如果您的協議不支持在應用程序級別添加此類消息,您也可以在 TCP 級別啟用 TCP 自己的內置 keep-alive 數據包。 在這種情況下,任何一方(或者最好是雙方)都可以在建立連接后調用TIdTCPConnection.Socket.Binding.SetKeepAliveValues()方法:

procedure SetKeepAliveValues(const AEnabled: Boolean; const ATimeMS, AInterval: Integer);

其中AEnabled打開/關閉 keep-alives, ATimeMS是發送第一個 keep-alive 數據包之前的空閑超時(毫秒), AInterval是發送每個后續 keep-alive 數據包之間的間隔(毫秒)。

就像任何其他 TCP 數據包一樣,keep-alives 在 TCP 級別得到確認。 因此,如果連接失效並且沒有響應保持活動,操作系統將在一段時間后超時並為您關閉 TCP 連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM