有没有办法用 C ping 特定的 IP 地址?

Posted

技术标签:

【中文标题】有没有办法用 C ping 特定的 IP 地址?【英文标题】:Is there any way to ping a specific IP address with C? 【发布时间】:2012-01-01 15:51:16 【问题描述】:

有没有办法用 C ping 一个特定的 IP 地址? 如果我想用一定数量的 ping 来 ping “www.google.com”,或者就此而言,本地地址,我需要一个程序来做到这一点。如何从 C ping 通?

【问题讨论】:

使用socket API (man socket)。 假设您不为 Google 工作,为什么要 ping Google? 它是特定于操作系统的。而www.google.com 不是IP 地址(但192.168.2.34 是一个)。 @dbasnett 你真的想不出任何可能的原因吗? 你怎么知道你的本地网关是否真的连接到互联网? 【参考方案1】:

您必须学习套接字、解析要 ping 的主机、发送适当的 ICMP 包并监听响应。标准库中没有ping 函数。但是,有很多更高级别的网络库已经实现了该协议。

【讨论】:

【参考方案2】:

这只是我发现的最简单的。

http://www.cise.ufl.edu/~cop4600/cgi-bin/lxr/http/source.cgi/commands/simple/ping.c

【讨论】:

如何定位 net/gen 文件?当我尝试编译时,它们似乎不可用! 我尝试使用您的链接时的答案:403 Forbidden 答案是2011年的!?【参考方案3】:

您可以使用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) 是你的朋友。

【讨论】:

希望您对 system/exec ping 方法有更好的解释。这将非常有帮助。 原始套接字链接已失效:/【参考方案4】:

目前还没有公认的答案,我在尝试完全按照这里提出的问题时偶然发现了这个问题,所以我想参考Aif's 答案here。 以下代码基于他的示例,在子进程中 ping 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;

【讨论】:

以上是关于有没有办法用 C ping 特定的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

没有禁ping却ping不通的情况如何排查

eNSP模拟器。不管谁ping谁都不通,地址没设置错,请问哪里还有问题?帮忙解答下

基于SAIL-IMX6网络可以ping通ip但是没有办法ping通域名解决办法

ubuntu 9.10为啥只能ping通本机 ping不通内网

为啥我的电脑ping不通别人

输入ifconfig的命令没找到ip地址是怎么回事