golang实现icmp中的ping功能
2014-10-06 14:16
393 查看
package main import ( "fmt" "net" "os" ) func checkSum(msg []byte) uint16 { sum := 0 len := len(msg) for i := 0; i < len-1; i += 2 { sum += int(msg[i])*256 + int(msg[i+1]) } if len%2 == 1 { sum += int(msg[len-1]) * 256 // notice here, why *256? } sum = (sum >> 16) + (sum & 0xffff) sum += (sum >> 16) var answer uint16 = uint16(^sum) return answer } func checkError(err error) { if err != nil { fmt.Fprint(os.Stderr, "Fatal error:", err.Error()) os.Exit(1) } } func main() { if len(os.Args) != 2 { fmt.Println("Usage: ", os.Args[0], "host") os.Exit(1) } service := os.Args[1] conn, err := net.Dial("ip4:icmp", service) checkError(err) var msg [512]byte msg[0] = 8 msg[1] = 0 msg[2] = 0 msg[3] = 0 msg[4] = 0 msg[5] = 13 msg[6] = 0 msg[7] = 37 msg[8] = 99 len := 9 check := checkSum(msg[0:len]) msg[2] = byte(check >> 8) msg[3] = byte(check & 0xff) fmt.Println(msg[0:len]) _, err = conn.Write(msg[0:len]) checkError(err) _, err = conn.Read(msg[0:]) checkError(err) fmt.Println(msg[0 : 20+len]) fmt.Println("Got response") if msg[20+5] == 13 { fmt.Println("Identifier matches") } if msg[20+7] == 37 { fmt.Println("Sequence matches") } if msg[20+8] == 99 { fmt.Println("Custom data matches") } os.Exit(0) }
相关文章推荐
- Golang1.7使用ICMP协议实现ping功能,带TIME和TTL
- ping功能实现(ICMP)
- VB6之ICMP实现ping功能
- C#下实现ping功能
- 用C语言实现Ping程序功能
- 用VC编写实现ping 功能的动态连接库
- luyikk 的C# PING 工具 与 传统的不一样的是 他可以修改你的 IP地址实现伪造ICMP数据包 ,当然 XP下无法使用 2003下才可以使用
- 用C语言实现Ping程序功能
- 用C语言实现Ping程序功能
- 用java实现ping功能
- VB中Ping功能的实现
- 用C#实现实现简单的 Ping 的功能,用于测试网络是否已经联通
- 用C语言实现Ping程序功能
- 用Java实现Ping的功能
- 用Java实现Ping的功能(续)
- 用Delphi实现智能化Ping命令功能
- ICMP协议规范:一种用于网络管理的协议。对照它您可以想一想PING命令实现的机理
- 用java实现ping功能
- C# 实现的Ping功能
- 用C#实现实现简单的 Ping 的功能,用于测试网络是否已经联通