three - protocolo tcp/ip
¿Cómo saber que la conexión TCP está cerrada en el paquete de red Golang? (3)
Soy nuevo en Golang.
Estoy implementando un pequeño servidor TCP, y ¿cómo puedo saber si uno de mis clientes cerró? ¿Debería tratar de leer o escribir y verificar si err es nulo?
Intente leer de él y arrojará un error si está cerrado. ¡Maneja con gracia si lo deseas!
Por el riesgo de regalar demasiado:
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
}
Aquí hay una buena introducción al uso del paquete de red para hacer un pequeño "servidor de chat" TCP:
Ese hilo "La mejor manera de detectar de manera confiable que una conexión TCP está cerrada ", usando net.Conn
para '' c
'' (también visto en utils/ping.go
o locale-backend/server.go
u otras muchas instancias ):
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))
}
Para detectar un tiempo de espera, sugiere:
if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
...
_, err := conn.Read(make([]byte, 0))
if err!=io.EOF{
// this connection is invalid
logger.W("conn closed....",err)
}else{
byt, _:= ioutil.ReadAll(conn);
}