ネットワーク上にある別の機器からデータを取得して、 それに基づいて展示などの動作をする機器を自動運転しようとする場合、 相手機器との通信が正常にできるかどうか 直前に確認してから動作させたい場合がある。
unix系OSなら、
if ping データ取得するべき相手機器というように、pingを使った状況確認が可能である。 MS-DOS上で動作するCenterNET PC/TCP Ver.6でも、
then 展示などの動作
fi
PING -z データ取得するべき相手機器という形でpingが使える。
IF ERRORLEVEL 1 GOTO 不調時の動作を記述した部分
展示などの動作
ところが、Windows標準のpingではこの方法が使えない (最近のWindowsでは変わっているかもしれないが、 少なくとも手元のWindows95やWindows98ではダメ) 。 相手機器との通信に成功したかどうかに関わらず、 常に「正常終了」のリターンコードを返すからである。
これでは困るので調べてみたところ、 手元のC++開発環境(Visual Studio 6.0)のヘルプ機能で検索できる MSDN(Microsoft Developper Network)のデータの中に 「Ping sample (Winsock SOCK_RAW echo)」というのがあった。 これはそのままコンパイルすると、オペレータが介入するまで 1000ミリ秒間隔で延々とpingし続けるコンソールアプリケーションになる。 これを微修正してコンパイルすることによって、 思い通りにリターンコードを返すpingを入手することができた。
具体的な修正内容は以下の通りである。
さて、手元でこの動作をさせたい機械が2つあって、 一方のWindows98機はこれで目的が達成された。 ところが、他方は古いWindows95で、Winsock2が入っていない。 そこで、Winsock1で動作させようと思って、 以下のように、更に修正を施してみた。
それにしても、Winsock2がインストールされてたら、 Winsock1のライブラリをリンクしてても SOCK_RAWを使ったコードが通るわけ? 変なの。