golang实现icmp中的ping功能
发布时间:2020-12-16 18:49:03 所属栏目:大数据 来源:网络整理
导读:package mainimport ("fmt""net""os")func checkSum(msg []byte) uint16 {sum := 0len := 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
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) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Lua table转C++数组
- 使用InnoSetup5创建Qt应用软件包setup.exe
- 使用Delphi Tokyo 10.2使用GetObjectProp获取TextSettings.
- uLua最新的Unity+Lua热更新解决方案!!!
- Delphi XE程序设计系列 2-开发DataSnap/REST服务器
- 算法 – 如何测量两个图像之间的相似性?
- perl – 暂时将STDOUT重定向到/ dev / null – 不能一直工作
- Perl的“祝福”到底做了什么?
- FZUOJ 1704 Turn off the light (高斯消元+大数高精度)
- 采用thinkphp自带方法生成静态html文件详解