您的位置:首页 > 理论基础 > 计算机网络

GO语言练习:网络编程 ICMP 示例

2015-07-20 23:14 666 查看
1、代码

2、编译及运行

1、Go语言网络编程:ICMP示例代码 icmptest.go

package main

import (
"fmt"
"net"
"os"
"io"
"bytes"
)

func main() {
if len(os.Args) != 2 {
fmt.Println("Usage : ", os.Args[0], "host")
os.Exit(0)
}
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
len := 8
check := checkSum(msg[0:len])
msg[2] = byte(check >> 8)
msg[3] = byte(check & 255)

_, err = conn.Write(msg[0:len])
checkError(err)

fmt.Println("Got response")
if msg[5] == 13 {
fmt.Println("Identifier matches")
}
if msg[7] == 37 {
fmt.Println("Sequence matches")
}

os.Exit(0)
}

func checkSum(msg []byte) uint16 {
sum := 0

for n := 1; n < len(msg) - 1; n += 2 {
sum += int(msg
) * 256 + int(msg[n+1])
}
sum = (sum >> 16 ) + (sum & 0xffff)
sum += (sum >> 16)
var answer uint16 = uint16(^sum)
return answer
}

func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error : %s\n", err.Error())
os.Exit(1)
}
}

func readFully(conn net.Conn) ([]byte, error) {
defer conn.Close()

result := bytes.NewBuffer(nil)
var buf [512]byte
for {
n, err := conn.Read(buf[0:])
result.Write(buf[0:n])
if err != nil {
if err == io.EOF {
break
}
return nil, err
}
}

return result.Bytes(), nil
}


2、编译及运行

$ go build icmptest.go
$ ls
icmptest  icmptest.go
$ ./icmptest www.baidu.com
Got response
Identifier matches
Sequence matches
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: