Est-il possible d'implémenter un ping ICMP dans Go? L'alternative est de lancer un processus 'ping', mais je préfère l'écrire dans Go.Implémentation d'un ping ICMP dans Go
Répondre
Actuellement, la fonction ICMP Echo (Ping) n'est pas prise en charge dans le package Go net.
Il n'y a pas de support pour l'envoi de demandes d'écho ICMP . Vous devez ajouter le support au package net. ping
Le code suivant montre comment effectuer un ping sur IPv4 à l'aide d'une prise brute (nécessite privs racine):
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)
}
}
code basé sur l'exemple trouvé ici: https://godoc.org/golang.org/x/net/icmp#PacketConn
Pour pour envoyer une requête ping à partir de Linux en tant qu'utilisateur non privilégié, voir this post
Actuellement, le numéro IANA pour ICMP (1) n'est pas accessible via 'iana.ProtocolICMP', mais il pourrait être accessible via' ipv4. ICMPTypeEcho.Protocol() '. Le paquet 'golang.org/x/net/interne/iana' est interne, lorsqu'il est utilisé, le compilateur go 1.8 dit:' l'utilisation du paquet interne n'est pas autorisée' cf: https://godoc.org/golang.org/x /net/ipv4#ICMPType.Protocol – TPPZ
Voir aussi https://godoc.org/golang.org/x/net/internal/iana – TPPZ
- 1. Aide à l'usurpation ICMP
- 2. ICMP et l'iPhone SDK
- 3. Implémentation de la fonctionnalité "Go to Home" dans Android?
- 4. Comment le ping de diffusion fonctionne?
- 5. Problèmes d'écoute ICMP
- 6. Ping dans ASP.NET
- 7. TCP Ping dans Silverlight
- 8. Comment puis-je effectuer un ping sur un hôte avec un doubleur Perl avec Net :: Ping?
- 9. Ping FeedBurner dans Django App
- 10. Valeur nulle dans Go
- 11. Singleton dans go
- 12. FFI dynamique dans Go
- 13. Comment enregistrer chaque message de réponse ICMP
- 14. envoyer RMCP ping
- 15. Traitement du signal dans Go
- 16. Explication des drapeaux dans Go
- 17. int de chaîne dans go
- 18. Traitement des tableaux dans Go
- 19. Collisions de fonctions dans Go
- 20. ruby ping pour 1.9.1
- 21. Aide Ping Class SendAsync
- 22. Échec Ping sans IPv6
- 23. Client ping aux serveurs
- 24. App conserve ping GPS
- 25. C Sockets Commande Ping?
- 26. Linux ping diffusion commutateur
- 27. Service Android - Ping URL
- 28. comment utiliser ping dans un script
- 29. Ping script avec email dans vbs
- 30. désactivation de la capacité des fenêtres à répondre à une requête ping
Maintenant (depuis fin mai 2010), Go prend en charge les sockets raw (voir le type net.IPConn) - ce qui signifie que vous pouvez implémenter ement ping-yourself - et il y a un exemple de ping sur https://code.google.com/p/go/source/browse/src/pkg/net/ipraw_test.go – nos
Le lien par @nos ne fonctionne plus. La nouvelle URL devrait être: https://golang.org/src/net/ipraw_test.go – TheHippo