2011-11-18 11 views
12

Cで特定のIPアドレスにpingを実行する方法はありますか? 特定の数のpingを使用して「www.google.com」にpingする場合、またはローカルアドレスを指定する場合は、そのためのプログラムが必要です。どのように私はCからpingできますか?Cで特定のIPアドレスにpingを実行する方法はありますか?

+0

'socket' API(' man socket')を使用してください。 –

+0

Googleで働いていないと仮定して、なぜGoogleにpingを実行したいですか? – dbasnett

+0

オペレーティングシステム固有です。また、「www.google.com」はIPアドレスではありません(ただし、192.168.2.34は1つです)。 –

答えて

3

あなたはソケットを学習し、pingを実行するホストを解決し、適切なICMPパッケージを送信し、応答を待ち受けなければなりません。標準ライブラリにはping関数はありません。しかし、すでにプロトコルを実装している上位レベルのネットワークライブラリがたくさんあります。

9

自分ICMP packetsraw socketsを使用して作成する可能性があり、それは些細なほど遠いです。 source code for ping(1)は、その方法を理解するのに適した場所です(BSDのようなライセンスを使用しています;フルライセンスのソースコードを参照してください)。 rawソケットはLinuxでroot権限を必要とするので、プログラムをrootに設定する必要があります。

もちろん、実行可能ファイルping(1)にシェルするのはずっと簡単で、これを自分で処理する必要はありません。コードライセンスについて心配する必要はなく、あなたのプログラムはroot特権を必要としません(別のもののためにそれらを必要としないと仮定して)。 system(3)popen(3)fork(3)/exec(3)はお友達です。

+0

私はあなたがsystem/exec pingメソッドのより良い説明を与えたことを望みます。これは非常に役に立ちました。 – CaptainBli

10

まだ受け入れられている回答はありません。ここで質問された内容を正確に実行しようとしているうちに、この質問を見つけましたので、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; 
}