2017-07-07 9 views
2

またはそれをチェックする方法はループ内のReadまたはWriteで利用できますか? connが閉じているか利用できない場合は、ループを停止する必要があります。例えばネットを確認する方法。

package main 

import "net" 

func main() { 
    conn, err := net.Dial("tcp", "127.0.0.1:1111") 
    defer conn.Close() 
    for { 
     buf := make([]byte, 1, 1) 
     n, err := conn.Read(buf) 
     if err != nil { 
      // currently we can only stop the loop 
      // when occur any errors 
      log.Fatal(err) 
     } 
    } 
} 

答えて

1

あなたは、接続が閉じられました方法に応じて、エラーの数を取得することができます。 Readからの受信でカウントできる唯一のエラーはio.EOFです。 io.EOFは、接続が正常に終了したことを示すために使用される値です。

他のエラーは、TimeoutTemporaryメソッドのnet.Errorインターフェイスに対して確認できます。これらは通常、タイプnet.OpErrorです。 Writeから返される一時的でないエラーは、書き込みが成功しなかったことを示す致命的なものですが、基になるネットワークAPIのため、エラーを返さない書き込みはまだ成功していないことに注意してください。

一般に、io.Reader APIに従うことができます。

n> 0バイトを正常に読み取った後、読み取りでエラーまたはファイルの終わりの条件が発生すると、読み取られたバイト数が返されます。同じ呼び出しから(非nil)エラーを返すか、後続の呼び出しからエラー(およびn == 0)を返します。この一般的なケースの例は、入力ストリームの終わりにゼロ以外のバイト数を返すReaderが、err == EOFまたはerr == nilのいずれかを返す可能性があることです。次のReadは0、EOFを返します。

読み込んだデータがある場合は、最初にそれを処理します。データを処理した後は、エラーが発生したときにループを解除することができます。それがio.EOFだった場合、接続は正常に閉じられ、その他のエラーは適切に処理できます。

+1

これは読み取りのみをカバーすることに注意してください。書き込みは 'io.EOF'を返すべきではありません。 – Adrian