2012-10-05 69 views

回答

45

該線程「 (utils/ping.golocale-backend/server.gomany other instances):

(使用 net.Conn作爲'
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 []字節片(可能讀至少一個字節,因此然後名稱) – 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); 
     } 
相關問題