2016-06-22 7 views
1

Ich habe einen Dateiserver in Golang erstellt und rufen Sie die Close() -Methode auf dem Listener.Golang hält Datei Server Socket geöffnet nach dem Schließen

Wenn ich versuche, über eine neue Webverbindung auf den Port zuzugreifen, wird der Socket geschlossen und ich kann nicht auf die Website zugreifen.

Wie auch immer, wenn ich die Seite mit einer Verbindung referenziere, die bereits hergestellt wurde .... die Seite wird neu geladen, als ob der Sockel nie geschlossen wurde? Ich bin sogar in der Lage, das Dateisystem zu durchsuchen.

Ich bemerkte nach 30 oder so Minuten scheint die Steckdose zu schließen.

Gibt es etwas, das ich vermisse, um den Socket zu zwingen, alle vorhandenen Verbindungen zu löschen, um zu verhindern, dass Menschen auf den Dateiserver zugreifen?

var fileListener net.Listener 
host_string = "127.0.0.1:8080" 
fileListener, _ = net.Listen("tcp", host_string) 
server := &http.Server{Addr: host_string, Handler:  
http.FileServer(http.Dir("/"))} 
go func() { server.Serve(fileListener) }() 
fileListener.Close() 

Antwort

2

Es gibt keine Möglichkeit, inaktive HTTP/1.1- oder HTTP2-Verbindungen herunterzufahren. Es gibt ein offenes Problem bei https://golang.org/issue/9478, aber keine unmittelbaren Pläne dafür. Beachten Sie, dass der Server nach dem Schließen des Listeners keine neuen Verbindungen mehr akzeptiert. Sie verwenden dieselbe Verbindung erneut.

Wenn Sie alle Verbindungen gewaltsam schließen möchten, müssen Sie die Buchhaltung selbst mit der http.ServerConnState durchführen, um die TCP-Verbindungen zu verfolgen, die aktiv sind.

Sie könnten auch Ihre Handler Connection: close auf jede Antwort gesetzt haben, aber das würde Ihren http-Server viel weniger effizient machen, wenn Kunden jemals mehr als 1 Anfrage machen müssen.

+0

Würden Sie den Handler mit einer TimeoutHandler-Hilfe umhüllen? (https://golang.org/pkg/net/http/#TimeoutHandler) –

+0

Ich folgte Ihrer Empfehlung der Verwendung von ConnState. Funktioniert perfekt! Vielen Dank! –

Verwandte Themen