Как узнать, что TCP-соединение закрыто в пакете Golang net?
Я новичок в Голанге.
Я реализую небольшой TCP-сервер и как узнать, закрылся ли один из моих клиентов? Должен ли я просто попытаться прочитать или написать и проверить, нет ли ошибки nil?
Ответы
Ответ 1
Этот поток " Лучший способ надежно обнаружить, что TCP-соединение закрыто", используя net.Conn
для 'c
' ( также см. в utils/ping.go
или locale-backend/server.go
или много других экземпляров):
one := []byte{}
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))
}
Для определения тайм-аута он предлагает:
if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
...
Ответ 2
Просто попробуйте прочитать его, и он закроет ошибку, если она будет закрыта. Обращайтесь с грациозно, если хотите!
Из-за риска слишком большого отдачи:
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
}
Вот хорошее введение в использование сетевого пакета для создания небольшого TCP-чата:
http://www.badgerr.co.uk/2011/06/20/golang-away-tcp-chat-server/
Ответ 3
_, err := conn.Read(make([]byte, 0))
if err!=io.EOF{
// this connection is invalid
logger.W("conn closed....",err)
}else{
byt, _:= ioutil.ReadAll(conn);
}