コロナに負けず、できることを少しずつ。

[ICT] ping コマンドは好きですか?(前半)

[ICT] ping コマンドは好きですか?(前半)

ping(ピング、ピン)コマンドについて語ろうよ

ICT 業界でエンジニア属性の方へ ping を使っていますか?と聞くと、ほぼ 100% の方から「ping 使わずにネットワーク疎通確認ができないから使っている」と答えるほど有名なコマンドです。

ところが、①ping コマンドの引数を使っていますか?②マイ ping コマンドを持っていますか?と質問を換えると…
①は実演してくれたりしますが、②は大体の場合で「は?」です。
また、①はおまけで他にも pathping コマンドも併用していると答える方もおられますが、意外と少ないのが現状。これはどうしたことか?と思うも本人が(ネットワーク トラブルシューティングの効率性が低くて)困っていないならスルーしておけばいいと思います。もしも、スルーしたくないならも聞いてみましょう。ただし、相手へ聞く前に「ICMP は例え話を用いず説明ができ(理解済み)、自分でソケット含めて ping.c をビルドできる」程度の経験値はあったほうが良いと思います。脱線しますが、例え話を濫りに用いると多くの場合で他者育成は失敗するので、教わるように教える姿勢へ行動変容してはいかがでしょうか。

① ping 8.8.8.8 -n 10
① ping 8.8.8.8 -t (CTRL+C で中断)
① ping corona.go.p -a (名前解決付き ping)
② は?

【参考情報】ping 引数について:

Linux shell で man ping とは別の内容です。
pathping ヘルプ表示
(PowerShell 出力ですがコマンドプロンプトでも同じ)

★マイクロソフト OS 付属コマンドなので公式ドキュメントをご覧になられたい方:
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/ping

★ウィキペディアで ping 資料をご覧になられたい方:
https://ja.wikipedia.org/wiki/Ping

btw, 普段はどんな特徴を持つ ping コマンドをお使いですか?

OS 標準コマンドしか使っていない方が圧倒的大多数と思いますが、中には pathping に fping や明らかにオーバーヘッドが重くなる traceroute (tracert) を代用している方も少なくはありません。

blog 記事として書くだけの内容を持っているのが ping コマンドなので「ご自身が普段使用する ping コマンドの特徴は何なのか」を考えませんか? 今まで考えもしなかった方でこのコンテンツは沼への入り口だ!と思った方は正解です。どうぞ、そっと Exit してください。

ここでは Windows 10 環境で「ping /?」を叩くと次に示す結果を得られるマイ ping コマンドをビルドして、且つ Windows 標準コマンドと差し替えて使用することをゴールにしています。
ちなみに、8.8.8.8 は dns.google
2a03:2880:f101:83:face:b00c:0:25de は www.facebook.com

 Usage: ping [options] <host> host Remote machine to ping options: -a 4|6 Address family (default AF_UNSPEC) -i ttl Time to live (default: 128) -l bytes Amount of data to send (default: 32) -r Record route (IPv4 only) Examples: [Remember to invoke .\ping.exe from the directory where the sample ping.exe is located instead of just ping.exe to make sure you are using the ping sample and not the standard ping utility that ships with Windows] .\ping.exe 8.8.8.8 - pings the machine with the ip 8.8.8.8 .\ping.exe -r 8.8.8.8 - pings the machine with the ip 8.8.8.8 and also prints the route .\ping.exe -a 6 2a03:2880:f101:83:face:b00c:0:25de - ping the machine with the above IPv6 address .\ping.exe -a 6 computer1	- ping the machine 'computer1' using its IPv6 address (if no IPv6	address is registered for computer1, ping will fail)

ping.c を読んだことが無い方へ朗報です。Windows Classic Samples (Windows 7) ソースが github にあります。

IPv4 / IPv6 対応 ping.c :713 sloc (21.6 KB)
https://github.com/microsoft/Windows-classic-samples/blob/master/Samples/Win7Samples/netds/winsock/ping/Ping.cpp

ビルドと使用例はコメントアウトに記載されているので、標準 ping コマンド構成を理解するには最適の教材と思います。もちろん、Windows ではなく Linux が良いんだ!という方は yum や apt でソースごと入手してください。
また、Windows Classic Samples に収録(公開)されている ping.c 以外にも何種類も存在するので、ブロック構成を読むだけでも違いが自ずと浮かび上がってくるでしょう。(個人差あり)

ping.exe は ping.c だけでビルドできません

前述 Windows Classic Samples / ping プロジェクトの ReadMe.txt に必要ファイルが記載されています。

README.TXT Readme file
MAKEFILE Makefile
PING.CPP Command-line Argument Processing and main()
RESOLVE.CPP Address resolution and reverse name lookup routines for ping
RESOLVE.H Header file for the routines in resolve.cpp
IPHDR.H Definitions of IP and ICMP structures for IPv4 and IPv6

ping コマンドは ICMP エコー要求メッセージを送信することで「接続」「到達可能性」「名前解決」を行う機能セットを持っています。そのため、コマンドラインと対話しコマンドのメイン処理を行う ping.c と、正引き/逆引き参照ルーチンを持つ resolve.cpp を構成するシンプルな実装となります。軽快なプログラム開発を実現する手段として、オブジェクト指向(もはや当たり前)があります。これはコンピュータハードウェアに依存したプログラミング技法などをコッテリ学習することなく、「カプセル化」「継承」「ポリモーフィズム(多様性)」によりプログラム開発ができるようになっています。

余談:プログラミングが苦手な方へ

エンドポイントを指定して何らかの機能を使うものや、API によるプログラム利用などは「プログラミング」ではないと言われることが多いと思いますが、それを実現しているのはオブジェクト指向だからです。
最近のノンコーディング(ロープログラミング)ツールが実現している簡便な開発環境はオブジェクト指向の賜物ですね。

またプログラムによって実現したいことは何だろうか?と列挙して、それに必要となる処理は何だろうか?と分解していく学習方法は間違いではありませんが、ベテランが適切に受講者のスキル(意欲、能力)を確認しながら導く必要があります。ベテランがいない場合や完全独学の場合は「気が滅入る」ので、結果として「苦手意識が深まる」だけだと考えます。

僕は/私は「プログラミングが苦手」と思うなら、プログラミングができ且つ教えるのが好き(得意)だと自負するベテラン(個人差あり)との出会いがあることを祈念いたします。手っ取り早くは、ICT コミュニティ参加でしょうね。

今回はここまでです。次回は Visual C++ プロジェクトとしてビルドします。

以上、ご覧いただき有難うございました。

Microsoftカテゴリの最新記事