在TCP連接的客戶端,我試圖儘可能重用已建立的連接,以避免每次需要連接時撥打的開銷。從根本上說,它是連接池,儘管從技術上講,我的池大小恰好是一個。如何查詢TCP連接狀態?
我遇到了一個問題,如果一個連接閒置足夠長的時間,另一端斷開連接。我試過使用類似以下的東西來保持連接活着:
err = conn.(*net.TCPConn).SetKeepAlive(true)
if err != nil {
fmt.Println(err)
return
}
err = conn.(*net.TCPConn).SetKeepAlivePeriod(30*time.Second)
if err != nil {
fmt.Println(err)
return
}
但是這沒有幫助。事實上,這導致我的關係更快關閉。我很肯定這是因爲(在Mac上),這意味着連接健康狀況在30秒後開始探測,然後以30秒的間隔探測8次。 服務器端不能支持keepalive,所以在4分30秒後,客戶端正在斷開連接。
我可以做任何事情來保持空閒連接無限期地活着,如果有一些方法可以讓我至少檢測到連接已關閉,以便我可以無縫地替換它與一個新的。唉,即使在閱讀完所有文檔並搜索blogosphere尋求幫助之後,我仍然無法找到任何方式來查詢TCP連接的狀態。
必須有一種方法。有沒有人對如何實現這一目標有所瞭解?非常感謝任何人!
編輯:
理想情況下,我想學習如何處理這個問題,低水平,而無需使用第三方庫來完成這個純go--。當然,如果有一些圖書館這樣做,我不介意指出它的方向,所以我可以看到他們是如何做到的。
也許我需要繼續並寫入連接,然後捕獲並分析錯誤,以查看是否建議再次重撥和寫入? –
您通過讀取而不是寫入來檢測到一個關閉的tcp連接。這在任何語言中都是一樣的,因爲它是基礎Berkeley套接字API的工作原理。 – JimB