Cで特定のIPアドレスにpingを実行する方法はありますか? 「www.google.com」に特定の数のpingを送信したい場合、またはローカルアドレスを使用したい場合は、そのためのプログラムが必要になります。 Cからpingするにはどうすればよいですか?
まだ受け入れられた答えはなく、ここで尋ねられたことを正確に実行しようとしているときにこの質問に出くわしたので、 Aif's answer here を参照したいと思いました。
次のコードは彼の例に基づいており、子プロセスでGoogleのパブリックDNSにpingを実行し、親プロセスで出力を出力します。
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#define BUFLEN 1024
int main(int argc, char **argv)
{
int pipe_arr[2];
char buf[BUFLEN];
//Create pipe - pipe_arr[0] is "reading end", pipe_arr[1] is "writing end"
pipe(pipe_arr);
if(fork() == 0) //child
{
dup2(pipe_arr[1], STDOUT_FILENO);
execl("/sbin/ping", "ping", "-c 1", "8.8.8.8", (char*)NULL);
}
else //parent
{
wait(NULL);
read(pipe_arr[0], buf, BUFLEN);
printf("%s\n", buf);
}
close(pipe_arr[0]);
close(pipe_arr[1]);
return 0;
}
rawソケット を使用して独自の ICMPパケット を作成することもできますが、それは簡単なことではありません。 ping(1)
のソースコードは、その方法を理解するための出発点として適しています(BSDのようなライセンスを使用しています。フルライセンスについては、ソースコードを参照してください)。 Linuxではrawソケットにはroot権限が必要であるため、プログラムはsetuidrootである必要があることに注意してください。
もちろん、ping(1)
実行可能ファイルにシェルアウトする方がはるかに簡単であり、これを自分で処理する必要はありません。コードのライセンスについて心配する必要はありません。また、プログラムにroot権限は必要ありません(他の目的でroot権限が必要ない場合)。 system(3)
、 popen(3)
、および fork(3)
/ exec(3)
はあなたの友達です。
ソケットを学習し、pingを実行するホストを解決し、適切なICMPパッケージを送信して、応答をリッスンする必要があります。標準ライブラリにはping
関数はありません。ただし、すでにプロトコルを実装している高レベルのネットワークライブラリがたくさんあります。