golang icmp의 ping 기능 구현
1436 단어 golang
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)
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.