2016-06-22 18 views
1

golangでファイルサーバーを作成し、リスナーでClose()メソッドを呼び出しました。Golangはファイルサーブソケットを開いたままにしておきます

新しいWeb接続でポートにアクセスしようとすると、Socketが閉じられていると表示され、Webサイトにアクセスできません。

すでに確立されている接続を使用してページをリバースするとどうなりますか?ページがまったく閉じられないようにページが再読み込みされますか?私はまだファイルシステムをブラウズすることさえできます。

30分ほど後にソケットが強制的に閉じるように見えました。

人がファイルサーバーにアクセスできないように既存のすべての接続を強制的に切断するようなものがありますか?

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

答えて

2

アイドル状態のHTTP/1.1またはHTTP2接続をシャットダウンする方法はありません。 https://golang.org/issue/9478に未解決の問題がありますが、すぐに計画はありません。リスナーを閉じると、サーバーは新しい接続を受け入れないことに注意してください。あなたは同じ接続を再利用しています。

すべての接続を強制的に終了したい場合は、http.ServerConnStateを使用して自分自身で簿記を行い、アクティブなTCP接続を追跡する必要があります。

ハンドラは応答ごとにConnection: closeに設定することもできますが、クライアントが1回以上のリクエストを行う必要がある場合は、httpサーバの効率が低下します。

+0

ハンドラをTimeoutHandlerのヘルプでまったくラッピングすることはできますか? (https://golang.org/pkg/net/http/#TimeoutHandler) –

+0

私はConnStateの使用を推奨しました。完璧に動作します!ありがとう! –

関連する問題