2011-11-18 59 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; 
} 
相关问题