C++ を使用して、コマンド/クラスを使用して、ホストへの ping からの待ち時間を取得し、プログラムで使用したいと考えています。pingコマンドを使ってみたのですが、他の統計情報と一緒に時間を集計するのは簡単ではありませんでした。私はより簡単なアプローチを望んでいました。
3 に答える
通常、pingツールは C で実装されており、生のソケットを介してICMP Echo 要求パケットを送信することによって機能します。システム時刻は、通常、posixの下でgettimeofdayを使用して記録されます。エコー要求が行われたときと、往復時間を決定するためにエコー応答(存在する場合) が受信されたときに再度記録されます。socketsを使用して、C++ アプリケーションに同じ機能を追加できます。
それ以外の場合は、ping システム コールから情報を抽出するのは、おそらく思ったより簡単です。重要なのは、パイプを開いて ping コマンドの標準出力を読み取れるようにすることです(popen
またはを参照_popen
)。正規表現(例: "time=([0-9]*)") を使用して、必要なデータを抽出できます。使用可能な正規表現ライブラリがない場合、このデータを抽出するには、かなり単純な文字列操作のみが必要です。STL 文字列クラスは、使用できるいくつかのアルゴリズムを提供します。
正規表現が気に入らない場合は、常に出力をループして、出力文字列を一度に 1 つずつステップ実行するだけで、t の後に i が続き、m が続き、e が続き、= が続くのを探すことができます。= の後に char へのポインターを格納し、さらにステップスルーして、次のスペースをゼロに置き換えます。レイテンシを含む文字列ができたので、既存の変換関数を使用して数値に変換できます。
たとえば、出力が char* 出力であり、長さが unsigned int length に格納されていて、一致した文字列が char* 一致に入る必要がある場合...
for(unsigned int i = 4; i < length; ++i)
{
if(output[i] == '=')
{
if((output[i-4] = 't') && (output[i-3] = 'i') && (output[i-2] = 'm') && (output[i-1] = 'e'))
{
match = &(output[i+1]);
while(output[i] != ' ') ++i;
output[i] = 0;
break;
}
}
}
ただし、正規表現の方が優れています...コードをより見やすく、読みやすくします。ただし、それらのライブラリがない場合は、このように実装する方が高速です... :)