有没有办法用 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 地址?的主要内容,如果未能解决你的问题,请参考以下文章
eNSP模拟器。不管谁ping谁都不通,地址没设置错,请问哪里还有问题?帮忙解答下
基于SAIL-IMX6网络可以ping通ip但是没有办法ping通域名解决办法