2012-10-05 6 views
35

私はゴランに新しいです。Golangネットパッケージでは、TCP接続が閉じられていますか?

私は小さなTCPサーバーを実装していますし、私のクライアントの一つが閉じられた場合にどのように私は知っていますか?私は読み書きしようとして、errがnilでないかどうかを調べるべきですか?

+0

あなたは[エラー](http://golang.org/pkg/net/#Error)の近くに見えることがありますか? – tomahh

+0

@TomAhhタイムアウト?それは本当に簡単です。 – liuyanghejerry

答えて

45

そのスレッド」 「c」(utils/ping.goまたはlocale-backend/server.goまたはmany other instancesにも表示されています)の場合はnet.Connを使用して、Best way to reliably detect that a TCP connection is closedとなります。

タイムアウトを検出するための
one := []byte{} 
c.SetReadDeadline(time.Now()) 
if _, err := c.Read(one); err == io.EOF { 
    l.Printf(logger.LevelDebug, "%s detected closed LAN connection", id) 
    c.Close() 
    c = nil 
} else { 
    var zero time.Time 
    c.SetReadDeadline(time.Now().Add(10 * time.Millisecond)) 
} 

、それが示唆:

if neterr, ok := err.(net.Error); ok && neterr.Timeout() { 
    ... 
+1

変数 'one'とは何ですか?サイズゼロのスライスが理にかなっています。 – ReyCharles

+0

@ReyCharlesバイトのスライス「b []バイト」(おそらく少なくとも1バイトを読み込み、それゆえに名前を読み取る) – VonC

+4

サイズゼロのスライスはどうでしょうか?その後、何も読まれず、タイムアウトがないかどうかだけチェックされます。 'zero:= make([] byte、0); ... c.Read(ゼロ); ... ' – ReyCharles

12

ちょうどそれから読もうとすると、それが閉じているとエラーになります。あなたが望むなら優雅に扱いなさい!あまり配っの危険性については

:相続人

func Read(c *net.Conn, buffer []byte) bool { 
    bytesRead, err := c.Read(buffer) 
    if err != nil { 
     c.Close() 
     log.Println(err) 
     return false 
    } 
    log.Println("Read ", bytesRead, " bytes") 
    return true 
} 

小さなTCP「のチャットサーバー」を作るために、ネットのパッケージを使用するための素晴らしい紹介:

http://www.badgerr.co.uk/2011/06/20/golang-away-tcp-chat-server/

-2
 _, err := conn.Read(make([]byte, 0)) 
     if err!=io.EOF{ 
      // this connection is invalid 
      logger.W("conn closed....",err) 

     }else{ 
      byt, _:= ioutil.ReadAll(conn); 
     } 
関連する問題