2012-10-05 12 views
35

मैं गोलांग के लिए नया हूं।गोलांग नेट पैकेज में टीसीपी कनेक्शन कैसे बंद है?

मैं एक छोटा टीसीपी सर्वर लागू कर रहा हूं, और मुझे कैसे पता चलेगा कि मेरे ग्राहकों में से एक बंद है या नहीं? क्या मुझे बस पढ़ने या लिखने की कोशिश करनी चाहिए और जांच करनी चाहिए कि क्या त्रुटि शून्य है?

+0

आप के पास नजर है [त्रुटि] (http://golang.org/pkg/net/#Error)? – tomahh

+0

@TomAhh टाइमआउट? यह वास्तव में सरल है। – liuyanghejerry

उत्तर

45

कि धागा " Best way to reliably detect that a TCP connection is closed " का उपयोग c '(utils/ping.go या locale-backend/server.go या many other instances में भी देखा गया है):

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

परिवर्तनीय 'एक' क्या है? आकार शून्य का एक टुकड़ा समझ में आता है। – ReyCharles

+0

@ReyCharles बाइट 'बी [] बाइट 'का एक टुकड़ा (शायद कम से कम एक बाइट पढ़ने के लिए, इसलिए नाम) – VonC

+4

आकार शून्य का एक टुकड़ा उपयोग करने के बारे में क्या? तब कुछ भी नहीं पढ़ा जाएगा और हम केवल टाइमआउट की जांच करेंगे। 'शून्य: = बनाना ([] बाइट, 0); ... सी। पढ़ें (शून्य); ... ' – 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 
} 

यहाँ शुद्ध पैकेज का उपयोग करने के लिए एक अच्छा परिचय एक छोटे से टीसीपी बनाने "बातचीत सर्वर" करने के लिए:

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); 
     } 
संबंधित मुद्दे