我想构建一个代码,给出一个ip-address只打印finalresult是否可达。我想我们必须使用ping命令,但我无法正确实现它。
答案 0 :(得分:8)
请注意,IP网络上的“可达性”是一种难以测试的方法。
服务器机器完全可能运行任意数量的实际服务(www,ftp,无论如何),但已配置为不回复自some people do that以来的ping。
如果可能的话,最好像想要检查的真实服务一样进行连接。
答案 1 :(得分:2)
考虑以下示例程序:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
int main()
{
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(65432); // Could be anything
inet_pton(AF_INET, "192.168.0.1", &sin.sin_addr);
if (connect(sockfd, (struct sockaddr *) &sin, sizeof(sin)) == -1)
{
printf("Error connecting 192.168.0.1: %d (%s)\n", errno, strerror(errno));
}
sin.sin_family = AF_INET;
sin.sin_port = htons(65432); // Could be anything
inet_pton(AF_INET, "192.168.0.9", &sin.sin_addr);
if (connect(sockfd, (struct sockaddr *) &sin, sizeof(sin)) == -1)
{
printf("Error connecting 192.168.0.9: %d (%s)\n", errno, strerror(errno));
}
}
在我的系统上打印:
Error connecting 192.168.0.1: 111 (Connection refused)
Error connecting 192.168.0.9: 113 (No route to host)
在我的网络上192.168.0.1
是我自己的计算机,192.168.0.9
是一个不在网络上的地址。
正如您所看到的,根据是否可以到达地址(第一行输出)或第二行(第二行),您会收到两个不同的错误。
答案 2 :(得分:1)
你想要使用popen()
在ping和你的程序之间构建一个管道(见例如:http://pubs.opengroup.org/onlinepubs/009695399/functions/popen.html)
然后你需要适当地解析输入。
答案 3 :(得分:1)
或使用libping库。
或者,假设某台HTTP服务器正在远程计算机上运行,请通过libcurl
发出HEAD
HTTP请求
或者对通过ping完成的低级系统调用进行编码。使用strace查找它们。
P.S。某些系统调用需要“root”权限。这就是/bin/ping
是setuid
答案 4 :(得分:1)
正如其他人所建议的那样,您可以使用popen()
。
但请记住,ping
不可靠,防火墙可以阻止ICMP回应(由ping使用),但主机仍然可以在特定端口上访问。