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

use*_*683 13 c

有没有办法用C ping特定的IP地址?如果我想用一定数量的ping ping"www.google.com",或者就此而言,使用本地地址,我需要一个程序来执行此操作.我如何从C ping?

小智 11

有没有公认的答案了,我偶然发现了这个问题,同时试图做的正是在这里问,所以我想指的AIF的答案在这里.
以下代码基于他的示例,并在子进程中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;
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*eld 9

你可以使用原始套接字制作自己的ICMP数据包,但这远非微不足道.该源代码是开始搞清楚如何做到这一点的好地方(它使用一个类似BSD许可证;请参阅完整许可的源代码).请记住,原始套接字在Linux上需要root权限,因此您的程序需要setuid root.ping(1)

当然,更容易实现ping(1)可执行文件,而不必自己处理任何这些问题.您不必担心代码许可,并且您的程序不需要root权限(假设它不需要其他东西). system(3),popen(3)fork(3)/ exec(3)是你的朋友.


K-b*_*llo 3

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