在 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中文網其他相關文章!