package main
import (
"fmt"
"syscall"
"unsafe"
)
/* #include <winsock2.h> #include <iphlpapi.h> #include <icmpapi.h> */
import "C"
const INADDR_NONE = 0xffffffff
var (
Ws2_32 = syscall.NewLazyDLL("Ws2_32.dll")
Iphlpapi = syscall.NewLazyDLL("Iphlpapi.dll")
inet_addr_proc = Ws2_32.NewProc("inet_addr")
IcmpCreateFile_proc = Iphlpapi.NewProc("IcmpCreateFile")
IcmpSendEcho_proc = Iphlpapi.NewProc("IcmpSendEcho")
)
type IP_OPTION_INFORMATION struct {
Ttl uint8
Tos uint8
Flags uint8
OptionsSize uint8
OptionsData uintptr
}
type ICMP_ECHO_REPLY struct {
Address uint32
Status uint32
RoundTripTime uint32
DataSize uint16
USHORT uint16
Data uintptr
Options IP_OPTION_INFORMATION
}
func main() {
var ip = syscall.StringBytePtr("192.168.0.1")
ip_addr,_,err := inet_addr_proc.Call(uintptr(unsafe.Pointer(ip)))
if ip_addr == INADDR_NONE {
fmt.Println("地址解析错误")
return
}
fd,err := IcmpCreateFile_proc.Call()
if syscall.Handle(fd) == syscall.InvalidHandle {
fmt.Printf("创建句柄失败:%s\n",err.Error())
return
}
var SendData [32]byte
copy(SendData[:],[]byte("Data Buffer"))
var reply ICMP_ECHO_REPLY
var ReplySize = unsafe.Sizeof(reply) + unsafe.Sizeof(SendData)
var ReplyBuffer = make([]byte,int(ReplySize))
_,err = IcmpSendEcho_proc.Call(fd,ip_addr,uintptr(unsafe.Pointer(&SendData[0])),unsafe.Sizeof(SendData), 0,uintptr(unsafe.Pointer(&ReplyBuffer[0])),ReplySize, 1000)
xx := (*ICMP_ECHO_REPLY)(unsafe.Pointer(&ReplyBuffer[0]))
fmt.Println(xx)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。