├── README.md ├── main.go └── screenshot.gif /README.md: -------------------------------------------------------------------------------- 1 | # nyan-ping 2 | 3 | にゃーん 4 | 5 | ![にゃーん](https://raw.githubusercontent.com/mattn/nyan-ping/master/screenshot.gif) 6 | 7 | ## Usage 8 | 9 | ``` 10 | Usage of nyan-ping: 11 | -6 ip6 12 | -s duration 13 | sleep (default 1ms) 14 | -t duration 15 | timeout (default 100ms) 16 | ``` 17 | 18 | ## Installation 19 | 20 | ``` 21 | $ go get github.com/mattn/nyan-ping 22 | ``` 23 | 24 | ## License 25 | 26 | MIT 27 | 28 | ## Author 29 | 30 | Yasuhiro Matsumoto (a.k.a. mattn) 31 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "fmt" 6 | "log" 7 | "net" 8 | "os" 9 | "time" 10 | 11 | "golang.org/x/net/icmp" 12 | "golang.org/x/net/ipv4" 13 | ) 14 | 15 | func main() { 16 | var sleep time.Duration 17 | var timeout time.Duration 18 | var ipv6 bool 19 | 20 | flag.DurationVar(&sleep, "s", 1*time.Millisecond, "sleep") 21 | flag.DurationVar(&timeout, "t", 100*time.Millisecond, "timeout") 22 | flag.BoolVar(&ipv6, "6", false, "ip6") 23 | flag.Parse() 24 | 25 | proto := "ip4" 26 | host := "pong4.kooshin.net" 27 | if ipv6 { 28 | proto = "ip6" 29 | host = "pong6.kooshin.net" 30 | } 31 | 32 | ip, err := net.ResolveIPAddr(proto, host) 33 | if err != nil { 34 | log.Fatalf("ResolveIPAddr: %v", err) 35 | } 36 | 37 | c, err := icmp.ListenPacket(proto+":icmp", "0.0.0.0") 38 | if err != nil { 39 | log.Fatalf("ListenPacket: %v", err) 40 | } 41 | defer c.Close() 42 | 43 | for i := 1; i <= 1400; i++ { 44 | wm := icmp.Message{ 45 | Type: ipv4.ICMPTypeEcho, 46 | Code: 0, 47 | Body: &icmp.Echo{ 48 | ID: os.Getpid() & 0xffff, Seq: i, 49 | Data: []byte("HELLO-R-U-THERE"), 50 | }, 51 | } 52 | wb, err := wm.Marshal(nil) 53 | if err != nil { 54 | log.Fatalf("Marshal: %v", err) 55 | } 56 | if _, err := c.WriteTo(wb, &net.IPAddr{IP: ip.IP}); err != nil { 57 | log.Fatalf("WriteTo: %v", err) 58 | } 59 | 60 | c.SetReadDeadline(time.Now().Add(timeout)) 61 | rb := make([]byte, 1500) 62 | n, _, err := c.ReadFrom(rb) 63 | if err != nil { 64 | fmt.Print("U") 65 | } else { 66 | rm, err := icmp.ParseMessage(ipv4.ICMPTypeEcho.Protocol(), rb[:n]) 67 | if err == nil && rm.Type == ipv4.ICMPTypeEchoReply { 68 | fmt.Print("!") 69 | } else { 70 | fmt.Print("U") 71 | } 72 | } 73 | if i%70 == 0 { 74 | fmt.Println() 75 | } 76 | time.Sleep(sleep) 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /screenshot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mattn/nyan-ping/be305b6e24699f5bee47f793e706b76ffa5c47e6/screenshot.gif --------------------------------------------------------------------------------