2011-11-18 58 views
12

有沒有辦法用C ping特定的IP地址? 如果我想用一定數量的ping或者就此問題使用本地地址ping「www.google.com」,那麼我需要一個程序來做到這一點。我怎麼能從C中ping?有沒有辦法用C ping特定的IP地址?

+0

使用'socket' API('man socket')。 –

+0

爲什麼你要ping谷歌,假設你不爲Google工作? – dbasnett

+0

它是特定於操作系統的。 「www.google.com」不是IP地址(但是「192.168.2.34」是一個)。 –

回答

3

你將不得不學習套接字,解析你想ping的主機,發送合適的ICMP包並監聽響應。標準庫中沒有ping函數。但是,有很多高級網絡庫已經實現了該協議。

9

你可以使用raw sockets自己ICMP packets手藝,但是,從瑣碎的遠。 source code for ping(1)是一個很好的開始瞭解如何做到這一點(它使用類似BSD的許可證;請參閱完整許可證的源代碼)。請記住,原始套接字在Linux上需要root權限,因此您的程序需要setuid root。

當然,更容易掏出ping(1)可執行文件,而無需親自處理任何這種情況。您不必擔心代碼授權,並且您的程序不需要root權限(假設它不再需要它們)。 system(3)popen(3)fork(3)/exec(3)是你的朋友。

+0

我希望你對系統/ exec ping方法給出了更好的解釋。這會非常有幫助。 – CaptainBli

10

目前還沒有公認的答案,我偶然發現了這個問題,同時試圖完成這裏提出的問題,所以我想參考Aif's答案here
以下代碼基於他的示例,並將Google的公有DNS放入子進程中,並在父進程中輸出輸出。

#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; 
} 
相關問題