首頁 > 後端開發 > Golang > 如何可靠地偵測 Go 的 net 套件中關閉的 TCP 連線?

如何可靠地偵測 Go 的 net 套件中關閉的 TCP 連線?

Mary-Kate Olsen
發布: 2024-12-24 10:39:28
原創
833 人瀏覽過

How Can I Reliably Detect Closed TCP Connections in Go's `net` Package?

在 Net 套件中監視 TCP 連線狀態

TCP 伺服器實作中的一個常見任務是決定客戶端連線何時關閉。本題探討了在 Go net 套件中偵測連線關閉的可靠方法。

檢查關閉的連線

建議的方法是嘗試讀取和寫入操作並檢查是否回傳 nil 錯誤。如果兩個操作都成功,則假定連線已開啟。但是,此方法有其限制。

使用超時進行可靠檢測

更可靠的解決方案包括設定讀取截止時間並嘗試單字節讀取。如果讀取完成時出現 io.EOF 錯誤,則連線視為已關閉。為了防止由於客戶端速度慢而導致誤報,可以設定非零讀取截止時間。

one := make([]byte, 1)
c.SetReadDeadline(time.Now())
if _, err := c.Read(one); err == io.EOF {
  // Connection closed
}
登入後複製

超時檢測

如果讀取超時到期,則提供error 會實現net.Error 接口,並且可以使用error 的Timeout() 方法來驗證

if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
  // Connection timed out
}
登入後複製

Go 1.7注意事項

在 Go 1.7 中,零位元組讀取立即返回,不會發生錯誤。因此,確保至少讀取一個位元組對於避免誤報至關重要。

以上是如何可靠地偵測 Go 的 net 套件中關閉的 TCP 連線?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板