如何检查在C for Linux中是否可以访问ip-address

时间:2012-02-29 12:04:01

标签: c linux

我想构建一个代码,给出一个ip-address只打印finalresult是否可达。我想我们必须使用ping命令,但我无法正确实现它。

5 个答案:

答案 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)

您可以使用例如使用popen命令ping

或使用libping库。

或者,假设某台HTTP服务器正在远程计算机上运行,​​请通过libcurl

发出HEAD HTTP请求

或者对通过ping完成的低级系统调用进行编码。使用strace查找它们。

P.S。某些系统调用需要“root”权限。这就是/bin/ping是setuid

的原因

答案 4 :(得分:1)

正如其他人所建议的那样,您可以使用popen()

但请记住,ping不可靠,防火墙可以阻止ICMP回应(由ping使用),但主机仍然可以在特定端口上访问。