有没有办法用C ping特定的IP地址? 如果我想用一定数量的ping ping“www.google.com”,或者就此而言,使用本地地址,我需要一个程序来执行此操作。我怎样才能从C上ping?
答案 0 :(得分:10)
还没有接受的答案,我在尝试完全按照此处提出的要求时偶然发现了这个问题所以我想参考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;
}
答案 1 :(得分:9)
您可以使用ICMP packets制作自己的raw sockets,但这远非琐碎。 source code for ping(1)
是开始弄清楚如何做到这一点的好地方(它使用类似BSD的许可证;请参阅完整许可证的源代码)。请记住,原始套接字在Linux上需要root权限,因此您的程序需要setuid root。
当然,更容易实现ping(1)
可执行文件,而不必自己处理任何这些问题。您不必担心代码许可,并且您的程序不需要root权限(假设它不需要其他东西)。 system(3)
,popen(3)
和fork(3)
/ exec(3)
是您的朋友。
答案 2 :(得分:4)
您必须学习套接字,解析要ping的主机,发送适当的ICMP包并听取响应。标准库中没有ping
函数。但是,有许多更高级别的网络库已经实现了该协议。
答案 3 :(得分:3)