गो

2010-05-30 17 views
6

में आईसीएमपी पिंग कार्यान्वित करना क्या गो में आईसीएमपी पिंग को कार्यान्वित करना संभव है? विकल्प 'पिंग' प्रक्रिया को फोर्क करना है, लेकिन मैं इसे गो में लिखना चाहता हूं।गो

उत्तर

5

वर्तमान में, आईसीएमपी इको (पिंग) फ़ंक्शन गो नेट पैकेज में समर्थित नहीं है।

आईसीएमपी इको अनुरोध भेजने के लिए कोई समर्थन नहीं है। आपको पैकेज को नेट पर समर्थन जोड़ना होगा। ping

+2

अब (मई 2010 के अंत से), गो कच्चे सॉकेट का समर्थन करता है (नेट.आईपीकॉन प्रकार देखें) - जिसका अर्थ है कि आप इम्प्लायर कर सकते हैं ement ping स्वयं - और https://code.google.com/p/go/source/browse/src/pkg/net/ipraw_test.go – nos

+0

पर एक पिंग उदाहरण है @nos द्वारा लिंक अब और काम नहीं करता है। नया यूआरएल होना चाहिए: https://golang.org/src/net/ipraw_test.go – TheHippo

9

निम्नलिखित कोड दिखाता है कि आईपीवी 4 से अधिक एक पिंग एक रॉ सॉकेट का उपयोग कर प्रदर्शन करने के लिए (रूट privs की आवश्यकता है):

package main 

import (
    "log" 
    "net" 
    "os" 

    "golang.org/x/net/icmp" 
    "golang.org/x/net/internal/iana" 
    "golang.org/x/net/ipv4" 
) 

const targetIP = "8.8.8.8" 

func main() { 
    c, err := icmp.ListenPacket("ip4:icmp", "0.0.0.0") 
    if err != nil { 
     log.Fatalf("listen err, %s", err) 
    } 
    defer c.Close() 

    wm := icmp.Message{ 
     Type: ipv4.ICMPTypeEcho, Code: 0, 
     Body: &icmp.Echo{ 
      ID: os.Getpid() & 0xffff, Seq: 1, 
      Data: []byte("HELLO-R-U-THERE"), 
     }, 
    } 
    wb, err := wm.Marshal(nil) 
    if err != nil { 
     log.Fatal(err) 
    } 
    if _, err := c.WriteTo(wb, &net.IPAddr{IP: net.ParseIP(targetIP)}); err != nil { 
     log.Fatalf("WriteTo err, %s", err) 
    } 

    rb := make([]byte, 1500) 
    n, peer, err := c.ReadFrom(rb) 
    if err != nil { 
     log.Fatal(err) 
    } 
    rm, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n]) 
    if err != nil { 
     log.Fatal(err) 
    } 
    switch rm.Type { 
    case ipv4.ICMPTypeEchoReply: 
     log.Printf("got reflection from %v", peer) 
    default: 
     log.Printf("got %+v; want echo reply", rm) 
    } 
} 

कोड उदाहरण के आधार पर पाया गया: https://godoc.org/golang.org/x/net/icmp#PacketConn

आदेश में एक गैर-विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में लिनक्स से पिंग करने के लिए, this post

+0

अभी आईसीएमपी (1) के लिए आईएएनए नंबर 'iana.ProtocolICMP 'के माध्यम से उपलब्ध नहीं है, लेकिन इसे' ipv4 के माध्यम से एक्सेस किया जा सकता है। ICMPTypeEcho.Protocol() '। पैकेज 'golang.org/x/net/internal/iana' आंतरिक है, जब 1.8 कंपाइलर का उपयोग किया जाता है:' आंतरिक पैकेज का उपयोग करने की अनुमति नहीं है 'cf .: https://godoc.org/golang.org/x /net/ipv4#ICMPType.Protocol – TPPZ

+0

इसके अलावा सीएफ। https://godoc.org/golang.org/x/net/internal/iana – TPPZ