2 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
該線程“的最佳方式可靠地檢測(cè)TCP連接被關(guān)閉”,使用net.Conn了“ c”(也可見于utils/ping.go或locale-backend/server.go或許多其他情況下):
one := make([]byte, 1)
c.SetReadDeadline(time.Now())
if _, err := c.Read(one); err == io.EOF {
l.Printf(logger.LevelDebug, "%s detected closed LAN connection", id)
c.Close()
c = nil
} else {
var zero time.Time
c.SetReadDeadline(time.Now().Add(10 * time.Millisecond))
}
為了檢測(cè)超時(shí),建議:
if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
...
更新2019:tuxedo25在評(píng)論中提到:
在Go 1.7+中,零字節(jié)讀取立即返回,并且永遠(yuǎn)不會(huì)返回錯(cuò)誤。
您必須至少讀取一個(gè)字節(jié)。
參見commit 5bcdd63并執(zhí)行issue 15735
net:不要io.EOF從零字節(jié)讀取中返回

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個(gè)贊
只要嘗試從中讀取,如果關(guān)閉它就會(huì)拋出錯(cuò)誤。如果您愿意,請(qǐng)優(yōu)雅地處理!
付出太多的風(fēng)險(xiǎn):
func Read(c *net.Conn, buffer []byte) bool {
bytesRead, err := c.Read(buffer)
if err != nil {
c.Close()
log.Println(err)
return false
}
log.Println("Read ", bytesRead, " bytes")
return true
}
- 2 回答
- 0 關(guān)注
- 300 瀏覽
添加回答
舉報(bào)