2010-05-30 46 views

Trả lời

5

Hiện tại, chức năng ICMP Echo (Ping) không được hỗ trợ trong gói Go net.

Không hỗ trợ gửi yêu cầu echo ICMP . Bạn sẽ phải thêm hỗ trợ để gói mạng. ping

+2

Bây giờ (từ cuối tháng 5 năm 2010), Go hỗ trợ ổ cắm thô (Xem loại net.IPConn) - có nghĩa là bạn có thể ement ping chính bạn - và có ví dụ về ping tại https://code.google.com/p/go/source/browse/src/pkg/net/ipraw_test.go – nos

+0

Liên kết của @nos không hoạt động nữa. URL mới phải là: https://golang.org/src/net/ipraw_test.go – TheHippo

9

Mã sau đây cho thấy làm thế nào để thực hiện một ping trên IPv4 sử dụng một socket thô (yêu cầu privs root):

package main 

import (
    "log" 
    "net" 
    "os" 

    "golang.org/x/net/icmp" 
    "golang.org/x/net/internal/iana" 
    "golang.org/x/net/ipv4" 
) 

const targetIP = "8.8.8.8" 

func main() { 
    c, err := icmp.ListenPacket("ip4:icmp", "0.0.0.0") 
    if err != nil { 
     log.Fatalf("listen err, %s", err) 
    } 
    defer c.Close() 

    wm := icmp.Message{ 
     Type: ipv4.ICMPTypeEcho, Code: 0, 
     Body: &icmp.Echo{ 
      ID: os.Getpid() & 0xffff, Seq: 1, 
      Data: []byte("HELLO-R-U-THERE"), 
     }, 
    } 
    wb, err := wm.Marshal(nil) 
    if err != nil { 
     log.Fatal(err) 
    } 
    if _, err := c.WriteTo(wb, &net.IPAddr{IP: net.ParseIP(targetIP)}); err != nil { 
     log.Fatalf("WriteTo err, %s", err) 
    } 

    rb := make([]byte, 1500) 
    n, peer, err := c.ReadFrom(rb) 
    if err != nil { 
     log.Fatal(err) 
    } 
    rm, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n]) 
    if err != nil { 
     log.Fatal(err) 
    } 
    switch rm.Type { 
    case ipv4.ICMPTypeEchoReply: 
     log.Printf("got reflection from %v", peer) 
    default: 
     log.Printf("got %+v; want echo reply", rm) 
    } 
} 

Mã dựa trên ví dụ tìm thấy ở đây: https://godoc.org/golang.org/x/net/icmp#PacketConn

Để để ping từ Linux với tư cách người dùng không có đặc quyền, hãy xem this post

+0

Hiện tại, số IANA cho ICMP (1) không thể truy cập thông qua 'iana.ProtocolICMP', nhưng nó có thể được truy cập thông qua« ipv4 ». ICMPTypeEcho.Protocol() '. Gói 'golang.org/x/net/internal/iana' là nội bộ, khi sử dụng trình biên dịch go 1.8 cho biết:' sử dụng gói nội bộ không được phép cf: https://godoc.org/golang.org/x /net/ipv4#ICMPType.Protocol – TPPZ

+0

Ngoài ra cf. https://godoc.org/golang.org/x/net/internal/iana – TPPZ

Các vấn đề liên quan