Подтвердить что ты не робот

Как узнать, что TCP-соединение закрыто в пакете Golang net?

Я новичок в Голанге.

Я реализую небольшой TCP-сервер и как узнать, закрылся ли один из моих клиентов? Должен ли я просто попытаться прочитать или написать и проверить, нет ли ошибки nil?

4b9b3361

Ответ 1

Этот поток " Лучший способ надежно обнаружить, что TCP-соединение закрыто", используя net.Conn для 'c' ( также см. в utils/ping.go или locale-backend/server.go или много других экземпляров):

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

Ответ 2

Просто попробуйте прочитать его, и он закроет ошибку, если она будет закрыта. Обращайтесь с грациозно, если хотите!

Из-за риска слишком большого отдачи:

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/

Ответ 3

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

        }else{
            byt, _:= ioutil.ReadAll(conn);
        }