2012-02-29 124 views
-2

我想要構建一個代碼,只要給出一個IP地址就可以打印可達或不可訪問的最終結果。我想我們必須使用ping命令,但無法正確實現它。如何檢查IP地址是否可以在C中用於linux

+2

打開終端並鍵入ping -help – 2012-02-29 12:07:38

+4

「我無法正確實現它」不是錯誤描述,並且這不是http://gimme-teh-codez.com – 2012-02-29 12:43:37

回答

8

請注意,IP網絡上的「可達性」是一種棘手的測試。

服務器機器運行任意數量的實際服務(www,ftp,無論)都是完全可能的,但已被配置爲自some people do that以來不回覆ping。

如果可能的話,最好像連接你想要檢查的實際服務那樣連接。

+1

+1真正的選擇 - 只要嘗試連接任何HTTP/IRC/FTP/POP/SMTP無論服務器。 – 2012-02-29 13:14:08

1

您可以使用例如popenping命令。可使用libping庫。

或者,假設一些HTTP服務器在遠程機器上運行,問題通libcurl

或代碼低級別的系統調用由平做了HEAD HTTP請求。使用strace找出它們。

P.S.一些系統調用需要「root」權限。這就是爲什麼/bin/ping是setuid

1

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

但請記住,ping是不可靠的,防火牆可以阻止ICMP回聲(由ping使用),但主機仍然可以在特定端口上訪問。

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

您的IPv6支持在哪裏? :( – 2012-02-29 12:44:16

+1

@LightnessRacesinOrbit不幸的是,我目前無法訪問支持IPv6的計算機,所以無法真正測試它,但結果應該是相同的,不是嗎? – 2012-02-29 14:35:08

+0

不是真的,區別在於你的工作不可行與IPv6。 – 2012-02-29 15:50:42

相關問題