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:
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