大佬教程收集整理的这篇文章主要介绍了用Golang自己构造ICMP数据包,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
ICMP是用来对网络状况进行反馈的协议,可以用来侦测网络状态或检测网路错误。
限于当前Golang在网络编程方面的代码稀缺,资料甚少,所以分享一个用Golang来构造ICMP数据包并发送ping程序的echo消息的实例。
RFC792定义的echo数据包结构:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identifier | Sequence number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data ... +-+-+-+-+-
package main import ( "bytes" "encoding/binary" "fmt" "net" ) type ICMP struct { Type uint8 Code uint8 checksum uint16 Identifier uint16 SequenceNum uint16 } func checkSum(data []bytE) uint16 { var ( sum uint32 length int = len(data) index int ) for length > 1 { sum += uint32(data[index])<<8 + uint32(data[index+1]) index += 2 length -= 2 } if length > 0 { sum += uint32(data[index]) } sum += (sum >> 16) return uint16(^sum) } func main() { var ( icmp ICMP laddr net.Ipaddr = net.Ipaddr{IP: net.ParseIP("192.168.137.111")} //***IP地址改成你自己的网段*** raddr net.Ipaddr = net.Ipaddr{IP: net.ParseIP("192.168.137.1")} ) //如果你要使用网络层的其他协议还可以设置成 ip:ospf、ip:arp 等 conn,err := net.DialIP("ip4:icmp",&laddr,&raddr) if err != nil { fmt.Println(err.Error()) return } defer conn.Close() //开始填充数据包 icmp.Type = 8 //8->echo @R_674_8798@ge 0->reply @R_674_8798@ge icmp.Code = 0 icmp.checksum = 0 icmp.Identifier = 0 icmp.SequenceNum = 0 var ( buffer bytes.buffer ) //先在buffer中写入icmp数据报求去校验和 binary.Write(&buffer,binary.bi@R_262_11064@ian,icmp) icmp.checksum = checkSum(buffer.bytes()) //然后清空buffer并把求完校验和的icmp数据报写入其中准备发送 buffer.Reset() binary.Write(&buffer,icmp) if _,err := conn.Write(buffer.bytes()); err != nil { fmt.Println(err.Error()) return } fmt.Printf("send icmp packet success!") }
看看我们构造的ICMP是否正确:
如果转载请注明出处:http://blog.csdn.net/gophers/article/details/21481447
以上是大佬教程为你收集整理的用Golang自己构造ICMP数据包全部内容,希望文章能够帮你解决用Golang自己构造ICMP数据包所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。