Czy można wdrożyć ping ICMP w Go? Alternatywą jest rozwidlenie procesu pingowania, ale wolę napisać go w Go.Implementacja ping ICMP w Go
Odpowiedz
Obecnie funkcja ICMP Echo (Ping) nie jest obsługiwana w pakiecie Go net.
Brak wsparcia dla wysyłania żądań echa ICMP . Musisz dodać obsługę do sieci pakietowej. ping
Poniższy kod pokazuje jak wykonać ping nad IPv4 przy użyciu gniazda surowego (wymaga 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)
}
}
kod oparty na przykład znaleźć tutaj: https://godoc.org/golang.org/x/net/icmp#PacketConn
Na zamówienie do pingowania z Linuksa jako nieuprzywilejowany użytkownik, zobacz this post
Obecnie numer IANA dla ICMP (1) nie jest dostępny za pośrednictwem 'iana.ProtocolICMP', ale można uzyskać do niego dostęp poprzez' ipv4. ICMPTypeEcho.Protocol() '. Pakiet 'golang.org/x/net/internal/iana' jest wewnętrzny, gdy jest używany kompilator go 1.8, który mówi:' użycie wewnętrznego pakietu niedozwolonego 'por .: https://godoc.org/golang.org/x /net/ipv4#ICMPType.Protocol – TPPZ
Również cf. https://godoc.org/golang.org/x/net/internal/iana – TPPZ
- 1. Android ICMP ping
- 2. Jak uruchomić ICMP ping na Androidzie
- 3. Jak zaimplementować ping ping PsPing w C#
- 4. Jak zaimplementować ping ICMP w Rubim, używając tylko standardu biblioteki gniazd?
- 5. pyton z nieuprzywilejowany ping w Linuksie IPPROTO_ICMP
- 6. Dlaczego ping działa bez uprawnień administratora?
- 7. żądanie ICMP otrzymała, ale nie odpowiadać
- 8. Jak Ping Korzystanie Sockets Library - C
- 9. Implementacja typowania strukturalnego OCaml, Scala i Go
- 10. Ping nazwa hosta w sieci
- 11. Ping wiele serwerów w Javie
- 12. C# ping minecraft
- 13. Latencja Bluetooth Ping
- 14. Status wyjścia polecenia ping
- 15. Implementacja funkcji Traceroute w Androidzie
- 16. Jaki jest prawidłowy proces dla żądania echa ICMP w nieosiągalnych miejscach docelowych?
- 17. Strona Ping i wynik zwrotu w PHP
- 18. Komunikat o błędzie portu ICMP nieosiągalny
- 19. Jak "Ping" z aplikacji Node.js?
- 20. Problem ping URL z C#
- 21. Czy PHP może pingować zdalny system bez protokołu ICMP i bez zewnętrznych programów?
- 22. Implementacja UDF java i wywołanie go z pyspark
- 23. Jak korzystać z protokołów ICMP i traceroutów w języku Java?
- 24. Implementacja Netcat w Pythonie
- 25. Różnica między Ping na Windows i Ubuntu
- 26. Ping Pong z Haskellem i Thrift utknął
- 27. Węzeł JS: Serwer i klient Ping UDP
- 28. Limit czasu iOS ping i ttl
- 29. Czy można napisać klasę Ping w języku C#, która będzie działać w środowisku Windows 8 Metro?
- 30. Implementacja Quadtree w Mathematica
Teraz (od końca maja 2010 r.) Go obsługuje nieprzetworzone gniazda (zobacz typ net.IPConn) - co oznacza, że możesz ementuj samemu ping - a na przykład https://code.google.com/p/go/source/browse/src/pkg/net/ipraw_test.go jest to – nos
Link przez @nos już nie działa. Nowy adres URL powinien być: https://golang.org/src/net/ipraw_test.go – TheHippo