urg three syn rst psh protocolos protocolo modelo funcionamiento fin caracteristicas banderas tcp go

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:

" Golang Ausente: 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); }