में आईसीएमपी पिंग कार्यान्वित करना क्या गो में आईसीएमपी पिंग को कार्यान्वित करना संभव है? विकल्प 'पिंग' प्रक्रिया को फोर्क करना है, लेकिन मैं इसे गो में लिखना चाहता हूं।गो
गो
उत्तर
वर्तमान में, आईसीएमपी इको (पिंग) फ़ंक्शन गो नेट पैकेज में समर्थित नहीं है।
आईसीएमपी इको अनुरोध भेजने के लिए कोई समर्थन नहीं है। आपको पैकेज को नेट पर समर्थन जोड़ना होगा। ping
निम्नलिखित कोड दिखाता है कि आईपीवी 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
अभी आईसीएमपी (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
इसके अलावा सीएफ। https://godoc.org/golang.org/x/net/internal/iana – TPPZ
अब (मई 2010 के अंत से), गो कच्चे सॉकेट का समर्थन करता है (नेट.आईपीकॉन प्रकार देखें) - जिसका अर्थ है कि आप इम्प्लायर कर सकते हैं ement ping स्वयं - और https://code.google.com/p/go/source/browse/src/pkg/net/ipraw_test.go – nos
पर एक पिंग उदाहरण है @nos द्वारा लिंक अब और काम नहीं करता है। नया यूआरएल होना चाहिए: https://golang.org/src/net/ipraw_test.go – TheHippo