【问题标题】:Is there any way to ping a specific IP address with C?有没有办法用 C ping 特定的 IP 地址?
【发布时间】: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 你真的想不出任何可能的原因吗?
  • 你怎么知道你的本地网关是否真的连接到互联网?

标签: c networking ip-address


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    【讨论】:

    • 如何定位 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-11
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多