3

次のコードがあります。

server := &http.Server{Addr: addr, Handler: r}

l, err := net.Listen("tcp", addr)
if err != nil {
    logging.Error("Failed opening socket: %s", err)
}

if err := server.Serve(l); err != nil {
    // error handling
}

l.Close()呼び出されるserver.Serve(l)と、エラーで終了します。これが本当にエラーなのか、誰かが電話をかけた結果なのかl.Close()(私にとってはエラーではありません) を知りたいです。

これを行う適切な方法はありますか?

4

2 に答える 2

1

TCP ソケットに関するいくつかのハック的な方法:

read_len, err := conn.Read(request)

if err != nil {

  if err.Error() == "use of closed network connection" { 
    // Do something when socket closed
    break
  }

または TCP ハンドラ関数で試してくださいif err.Error() == "use of closed network connection"if err := server.Serve(l); err != nil {

于 2013-05-24T05:01:43.363 に答える
0

実装するインターフェイスを使用するio.ReadWriteCloserと、通常io.EOFio.ErrUnexpectedEOFエラーが返されます。net.Listenerを実装io.Closerしているため、このエラーも返されると予想されますが、残念ながらこの規則には従いません。代わりに、net.go でプライベートに宣言された errClosing を返します。

によって返されるエラーnet.Listenerは でラップされnet.OpErrorます。この構造体には、役立つ可能性のある追加情報が含まれています。具体的には、"Op" と "Err" です。「Op」は、エラーが発生した場所を示します。実行するClose() errorと、「accept」が返されます。ドキュメントには、「読み取り」と「書き込み」を戻すこともできると書かれています。

を取得するには、次のようnet.OpErrorにします。

err := server.Serve(l)
if opErr, ok := err.(*net.OpError); ok {
    // opErr.Op, opErr.Err, ...
}

net.Listenerまたは、次のように (常に a を返すと仮定してnet.OpError):

err := server.Serve(l).(*net.OpError)

net.OptError.Err は元のエラーを返します。これは、エラーがエクスポートされた場合に役立ちます。いずれにせよ、将来のバージョンで壊れる可能性があるため、文字列をチェックすることはお勧めしません。持っていないエクスポートされたエラーとエラーを直接比較することをお勧めします。

net.OptError関数もTemporary() bool宣言されています。net/httpパッケージはこれを使用して、増加する間隔で接続を再確立します。したがって、 の場合、net/http返されるエラーは を呼び出した結果であると想定しますClose() error。それ以外の場合Temporary() boolは true が返さnet/httpれます。

于 2013-06-18T17:11:57.643 に答える