私はゴランに新しいです。Golangネットパッケージでは、TCP接続が閉じられていますか?
私は小さなTCPサーバーを実装していますし、私のクライアントの一つが閉じられた場合にどのように私は知っていますか?私は読み書きしようとして、errがnilでないかどうかを調べるべきですか?
私はゴランに新しいです。Golangネットパッケージでは、TCP接続が閉じられていますか?
私は小さなTCPサーバーを実装していますし、私のクライアントの一つが閉じられた場合にどのように私は知っていますか?私は読み書きしようとして、errがnilでないかどうかを調べるべきですか?
そのスレッド」 「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() {
...
変数 'one'とは何ですか?サイズゼロのスライスが理にかなっています。 – ReyCharles
@ReyCharlesバイトのスライス「b []バイト」(おそらく少なくとも1バイトを読み込み、それゆえに名前を読み取る) – VonC
サイズゼロのスライスはどうでしょうか?その後、何も読まれず、タイムアウトがないかどうかだけチェックされます。 'zero:= make([] byte、0); ... c.Read(ゼロ); ... ' – ReyCharles
ちょうどそれから読もうとすると、それが閉じているとエラーになります。あなたが望むなら優雅に扱いなさい!あまり配っの危険性については
:相続人
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/
_, err := conn.Read(make([]byte, 0))
if err!=io.EOF{
// this connection is invalid
logger.W("conn closed....",err)
}else{
byt, _:= ioutil.ReadAll(conn);
}
あなたは[エラー](http://golang.org/pkg/net/#Error)の近くに見えることがありますか? – tomahh
@TomAhhタイムアウト?それは本当に簡単です。 – liuyanghejerry