2016-06-14 23 views
0

Wenn ich einen Browser schließe, möchte ich einen Websocket in 3 Sekunden statt 1 Minute trennen. Die folgenden schreiben einfach weiter in eine void ohne Fehler, bis die tcp ip timeout ich denke, nicht die SetWriteDeadline.Wie verwende ich ws.SetWriteDeadline?

f := func(ws *websocket.Conn) { 
    for { 
     select { 
     case msg := <-out: 
      ws.SetWriteDeadline(time.Now().Add(3 * time.Second)) 
      if _, err := ws.Write([]byte(msg)); err != nil { 
       fmt.Println(err) 
       return 
      } 
     case <-time.After(3 * time.Second): 
      fmt.Println("timeout 3") 
      return 
     } 
    } 
} 
return websocket.Handler(f) 

Ich brauche für dieses err

write tcp [::1]:8080->[::1]:65459: write: broken pipe

warten, bevor sie schließlich die Verbindung schließt, die etwa eine Minute dauert oder mehr.

Antwort

3

Sie verwenden WriteDeadline korrekt. Die Deadline gibt die Zeit für das Schreiben von Daten in die Puffer des TCP-Stacks an und nicht die Zeit, zu der der Peer die Daten empfängt (falls dies überhaupt der Fall ist).

Um geschlossene Verbindungen zuverlässig zu erkennen, sollte die Anwendung PINGs an den Peer senden und auf die erwarteten PONGs warten. Das Paket, das Sie verwenden, unterstützt diese Funktionalität nicht, aber das Gorilla-Paket tut es. Die Gorilla chat application zeigt, wie mit PING und PONG geschlossene Verbindungen erkannt werden.