Có thể triển khai ping ICMP trong Go không? Cách khác là để nới rộng quy trình 'ping', nhưng tôi muốn viết nó trong Go.Thực hiện ping ICMP trong Go
Trả lời
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
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
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
Ngoài ra cf. https://godoc.org/golang.org/x/net/internal/iana – TPPZ
- 1. Android ICMP ping
- 2. cách ping icmp trên android
- 3. Có thể thực hiện ping trên windows phone 7 không?
- 4. Làm thế nào để kích hoạt tính năng Ping (ICMP) trên Azure
- 5. trăn không có đặc quyền ICMP
- 6. Nhận tên quy trình hiện tại (thực thi) trong Go?
- 7. Làm cách nào để triển khai ping ICMP trong Ruby bằng cách sử dụng thư viện socket chuẩn?
- 8. Ping SNMP là gì?
- 9. Ổ cắm ICMP (linux)
- 10. Xác thực HTTP cơ bản trong Go
- 11. Scapy cách nhận thời gian ping?
- 12. icmp đã nhận được, nhưng không trả lời
- 13. Ping một dải IP với Scapy
- 14. Làm thế nào tôi có thể ping một máy chủ với một Perl một lớp lót với Net :: Ping?
- 15. Làm thế nào để thực hiện cuộc gọi SOAP trong Go?
- 16. Đảm bảo một loại thực hiện một giao diện tại thời gian biên dịch trong Go
- 17. Trong phần Go, thực hiện lệnh break break từ một switch/select?
- 18. Cách ping không cần quyền quản trị trên Windows?
- 19. Ping với iPhone SDK
- 20. Sử dụng ping trong C#
- 21. PHP có thể ping một hệ thống từ xa mà không có ICMP và không có các chương trình bên ngoài không?
- 22. Danh sách quy trình hiện đang chạy trong Go
- 23. C# ping minecraft
- 24. Linux ping broadcast switch
- 25. Thực hiện chức năng Traceroute trong android
- 26. Bluetooth Ping Latency
- 27. Làm thế nào để ICMP và traceroutes trong Java
- 28. Dịch vụ Android - Ping URL
- 29. ping ruby cho 1.9.1
- 30. ActiveMQ JMS ping
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
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