Cで特定のIPアドレスにpingを実行する方法はありますか? 特定の数のpingを使用して「www.google.com」にpingする場合、またはローカルアドレスを指定する場合は、そのためのプログラムが必要です。どのように私はCからpingできますか?Cで特定のIPアドレスにpingを実行する方法はありますか?
答えて
あなたはソケットを学習し、pingを実行するホストを解決し、適切なICMPパッケージを送信し、応答を待ち受けなければなりません。標準ライブラリにはping
関数はありません。しかし、すでにプロトコルを実装している上位レベルのネットワークライブラリがたくさんあります。
これは私が見つけた最も単純なものです。
http://www.cise.ufl.edu/~cop4600/cgi-bin/lxr/http/source.cgi/commands/simple/ping.c
net/genファイルはどのようにして見つけられますか?彼らは私が試してコンパイルすると利用できないように見えます! –
自分ICMP packetsraw socketsを使用して作成する可能性があり、それは些細なほど遠いです。 source code for ping(1)
は、その方法を理解するのに適した場所です(BSDのようなライセンスを使用しています;フルライセンスのソースコードを参照してください)。 rawソケットはLinuxでroot権限を必要とするので、プログラムをrootに設定する必要があります。
もちろん、実行可能ファイルping(1)
にシェルするのはずっと簡単で、これを自分で処理する必要はありません。コードライセンスについて心配する必要はなく、あなたのプログラムはroot特権を必要としません(別のもののためにそれらを必要としないと仮定して)。 system(3)
、popen(3)
、fork(3)
/exec(3)
はお友達です。
私はあなたがsystem/exec pingメソッドのより良い説明を与えたことを望みます。これは非常に役に立ちました。 – CaptainBli
まだ受け入れられている回答はありません。ここで質問された内容を正確に実行しようとしているうちに、この質問を見つけましたので、Aif'sの回答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;
}
'socket' API(' man socket')を使用してください。 –
Googleで働いていないと仮定して、なぜGoogleにpingを実行したいですか? – dbasnett
オペレーティングシステム固有です。また、「www.google.com」はIPアドレスではありません(ただし、192.168.2.34は1つです)。 –