2012-10-05 27 views

Respuesta

45

Ese hilo " Best way to reliably detect that a TCP connection is closed ", usando net.Conn para 'c' (también visto en utils/ping.go o locale-backend/server.go o many other instances):

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, se sugiere:

if neterr, ok := err.(net.Error); ok && neterr.Timeout() { 
    ... 
+1

¿Cuál es la variable "uno"? Una rebanada de tamaño cero tendría sentido. – ReyCharles

+0

@ReyCharles una porción de byte 'b [] byte' (probablemente para leer al menos un byte, de ahí el nombre) – VonC

+4

¿Qué tal si usamos una porción del tamaño cero? Entonces no se leerá nada y solo revisaremos el tiempo de espera. 'cero: = make ([] byte, 0); ... c.Leer (cero); ... ' – ReyCharles

12

Intente leer de él y se generará un error si está cerrado. ¡Maneja con gracia si lo deseas!

Para el riesgo de revelar 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 
} 

Heres una buena introducción al uso del paquete de red para hacer una red TCP "servidor de chat":

http://www.badgerr.co.uk/2011/06/20/golang-away-tcp-chat-server/

-2
 _, err := conn.Read(make([]byte, 0)) 
     if err!=io.EOF{ 
      // this connection is invalid 
      logger.W("conn closed....",err) 

     }else{ 
      byt, _:= ioutil.ReadAll(conn); 
     } 
Cuestiones relacionadas