...
1
2
3
4
5 package icmp_test
6
7 import (
8 "log"
9 "net"
10 "os"
11 "runtime"
12
13 "golang.org/x/net/icmp"
14 "golang.org/x/net/ipv6"
15 )
16
17 func ExamplePacketConn_nonPrivilegedPing() {
18 switch runtime.GOOS {
19 case "darwin", "ios":
20 case "linux":
21 log.Println("you may need to adjust the net.ipv4.ping_group_range kernel state")
22 default:
23 log.Println("not supported on", runtime.GOOS)
24 return
25 }
26
27 c, err := icmp.ListenPacket("udp6", "fe80::1%en0")
28 if err != nil {
29 log.Fatal(err)
30 }
31 defer c.Close()
32
33 wm := icmp.Message{
34 Type: ipv6.ICMPTypeEchoRequest, Code: 0,
35 Body: &icmp.Echo{
36 ID: os.Getpid() & 0xffff, Seq: 1,
37 Data: []byte("HELLO-R-U-THERE"),
38 },
39 }
40 wb, err := wm.Marshal(nil)
41 if err != nil {
42 log.Fatal(err)
43 }
44 if _, err := c.WriteTo(wb, &net.UDPAddr{IP: net.ParseIP("ff02::1"), Zone: "en0"}); err != nil {
45 log.Fatal(err)
46 }
47
48 rb := make([]byte, 1500)
49 n, peer, err := c.ReadFrom(rb)
50 if err != nil {
51 log.Fatal(err)
52 }
53 rm, err := icmp.ParseMessage(58, rb[:n])
54 if err != nil {
55 log.Fatal(err)
56 }
57 switch rm.Type {
58 case ipv6.ICMPTypeEchoReply:
59 log.Printf("got reflection from %v", peer)
60 default:
61 log.Printf("got %+v; want echo reply", rm)
62 }
63 }
64
View as plain text