[Ruby] Ich habe einen einfachen Ping-Client erstellt
Überblick
Ich habe einen einfachen Client erstellt, der ICMP-Echoanfragen nur einmal sendet und empfängt. Bevor ich es vergesse, habe ich mir notiert, was ich zum Zeitpunkt der Implementierung gelernt habe und worauf ich geachtet habe.
Lieferbarer Link
https://rubygems.org/gems/simple_ping
https://github.com/kuredev/simple_ping
Zweck
- Praxis der Netzwerkprogrammierung
- Praxis der Freigabe von Edelsteinpaketen
--Ablenkung
Was / Wie zu verwenden
Was du tun kannst
- Gibt den Erfolg oder Misserfolg des Ping-Ergebnisses (ICMP) als wahr / falsch zurück
- Das Ziel ist die IP-Adresse
Dinge unmöglich
- Vom FQDN angegebenes Ziel
--Wiederholen
- Anpassung der Übertragungsdaten (ID-Spezifikation, Datenteilspezifikation usw.)
- usw.
Verwendungsbeispiel
ping.rb
require "simple_ping"
ping_client = SimplePing::Client.new(src_ip_addr: "192.168.1.100")
puts ping_client.exec(dest_ip_addr: "192.168.1.101") ? "Success!" : "Failed.."
- Zum Zeitpunkt der Ausführung ist eine Root-Berechtigung erforderlich
console
> sudo ruby ping.rb
Success!
Implementierungshinweise
- Sie werden Socket-Programmierung durchführen, aber wenn Sie sich die [Dokumentation] ansehen (https://docs.ruby-lang.org/ja/latest/class/Socket.html#C_-SOC-K_-DGRAM), werden Sie einige Sockets sehen. Es gibt auch Typen, aber dieses Mal werde ich den ICMP-Header direkt berühren, also werde ich
SOCK_RAW
(Raw-Socket) verwenden.
- Wenn Sie die Daten endgültig senden (send), müssen Sie die Daten als Zeichenfolge angeben. Es gibt. Die vorbereitete ICMP-Header-Datenzeichenfolge muss gemäß dem ASCII-Code byteweise in eine Zeichenfolge konvertiert werden.
- Wenn zum Beispiel der "Bezeichner" 65 ist, ist 65 im [ASCII-Code] "A" (http://www3.nit.ac.jp/~tamura/ex2/ascii.html), also "A. Sie müssen `senden.
- Auf Ruby können Sie Zeichen gemäß dem ASCII-Code erhalten, indem Sie
65.chr
usw. verwenden. Referenz
- Beachten Sie jedoch, dass der Codierungstyp [je nach Einstellung unterschiedlich] zu sein scheint (https://docs.ruby-lang.org/ja/latest/method/Integer/i/chr.html).
- Beim Empfang wird es von der
recvfrom
-Methode empfangen, und die Daten können als Zeichenfolge abgerufen werden.
- Die erfassten Daten enthalten den IP-Header.
- Da die Größe des IP-Headers im Grunde genommen 20 Byte beträgt (es scheint, dass dies unterschiedlich sein kann, diesmal jedoch in der Implementierung nicht angenommen wird), können die Daten des ICMP-Headers in der Reihenfolge ab dem 21. Byte erfasst werden.
- Wenn es sich beispielsweise um den "Typ" am Anfang des ICMP-Headers handelt, können Sie ihn wie folgt abrufen.
- Sie können eine Zeichenfolge mit der Methode "Bytes" in ASCII-Code konvertieren
mesg, _ = socket.recvfrom(1500)
mesg[21].bytes[0] #=> 0
- Zum Zeitpunkt des Empfangs muss festgestellt werden, ob das empfangene Paket das Rückpaket des gesendeten Elements ist, aber die Entsprechung zwischen Senden und Empfangen durch Zusammenstellen von "ID", "Sequenznummer" und "Typ" (unten) überprüft werden. Laut RFC)
Die in der empfangenen Echo-Nachricht enthaltenen Daten müssen als Daten in der Echo-Antwortnachricht zurückgegeben werden.
Die Kennung und die Sequenznummer werden vom Echoabsender verwendet, um die Echoanforderung mit ihrer Antwort zu verknüpfen. Die Kennung kann verwendet werden, beispielsweise die Portnummer, die von TCP oder UDP zum Identifizieren der Sitzung verwendet wird, oder die Sequenznummer kann bei jeder Echoanforderung erhöht werden. Die Echo-Rückgabeseite gibt den gleichen Wert in der Echo-Antwort zurück.
http://srgia.com/docs/rfc792j.html
Referenz
Ich habe mit Ruby verschiedene Sockets gemacht und mit ihnen gespielt. --Qiita https://qiita.com/MikuriyaHiroshi/items/b0a40f5e7b7be1ef327c
[Ruby] Netzwerkprogramm mit RawSocket - Euniclus https://euniclus.com/article/ruby-port-scan/
BasicSocket # send (Ruby 2.7.0 Referenzhandbuch) https://docs.ruby-lang.org/ja/latest/method/BasicSocket/i/send.html
Internet Control Message Protocol - Wikipedia https://ja.wikipedia.org/wiki/Internet_Control_Message_Protocol#ICMP%E3%83%98%E3%83%83%E3%83%80
Konvertieren Sie ASCII-Codes und -Zeichen (ord, chr, bytes, entpacken, Codepunkte) | Makumaku Ruby Notes https://maku77.github.io/ruby/number/ascii-char.html
RFC792(INTERNET CONTROL MESASAGE PROTOCOL) http://srgia.com/docs/rfc792j.html