Comment savoir si la connexion TCP est fermée dans le paquet Golang net?

Je suis nouveau à Golang.

j'implémente un petit serveur TCP, et comment savoir si l'un de mes clients a fermé? Est-ce que je devrais juste essayer de lire ou écrire et vérifier si l'erreur est nulle?

42
demandé sur liuyanghejerry 2012-10-05 11:14:00

3 réponses

le thread "meilleur moyen de détecter de manière fiable qu'une connexion TCP est fermée", à l'aide de " (également vu dans utils/ping.go ou locale-backend/server.go ou beaucoup d'autres cas):

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))
}

Pour la détection d'un délai d'attente, il suggère:

if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
  ...
50
répondu VonC 2017-10-15 18:01:49

Juste essayer de lire, et il lèvera une erreur s'il est fermé. Poignée gracieusement si vous le souhaitez!

Pour le risque de donner trop:

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
}

Voici une belle introduction à l'utilisation du paquet net pour faire un petit "serveur de chat" TCP:

"Golang Loin: TCP Serveur de Chat"

13
répondu minikomi 2018-04-29 04:46:43
        _, err := conn.Read(make([]byte, 0))
        if err!=io.EOF{
            // this connection is invalid
            logger.W("conn closed....",err)

        }else{
            byt, _:= ioutil.ReadAll(conn);
        }
-2
répondu liam 2016-10-17 08:58:19