2016-09-29 4 views
0

Ich wollte ein Programm als CheckNet machen, wenn die Adresse oben ist Rückkehr 1, wenn es Rückkehr 0. Hier unten ist der Code:ICMP-Buchse (win)

#include <stdio.h> 
#include <winsock2.h> 
#include <stdint.h> 
#pragma comment(lib, "ws2_32.lib") 

static void init(void) 
{ 

    WSADATA wsa; 
    int err = WSAStartup(MAKEWORD(2, 2), &wsa); 
    if(err < 0) 
    { 
     puts("WSAStartup failed !"); 
     exit(EXIT_FAILURE); 
    } 

} 

static void end(void) 
{ 

    WSACleanup(); 

} 

int chknet(char * ip) 
{ 
    struct sockaddr_in name; 
    struct hostent * hent; 
    int sock; 
    int retour = 0; 
init(); 
/* creat socket icmp */ 
      if(!(sock = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP))) return (-1); 
        memset(&name,0,sizeof(struct sockaddr_in)); 
        name.sin_family = AF_INET; 
        name.sin_addr.s_addr = inet_addr(ip); 
      if(connect(sock,(struct sockaddr *) &name,sizeof(struct sockaddr))==0) retour = 1; 
      else retour = 0; 

end(); 
return(retour); 
} 
// Fonction main *************************** 
int main(int argc, char *argv[]) 
{ 
    char *adress="www.stackoverflow.com"; 
    int a= chknet(adress); 
    printf("result %d\n",a); 
    system("PAUSE"); 

} 

Als ich mit dem Internet verbunden bin es gibt 1 zurück, aber selbst wenn ich es nicht zu 1 verbunden bin zurück, aber es sollte 0 THX

Antwort

0

Sie kehren sind vorbei die Zeichenfolge "www.stackoverflow.com"inet_addr() zu funktionieren. Diese Funktion erwartet eine "IPv4-Nummern-und-Punkt-Notation" -Adresse, etwa 151.101.1.69 - Sie müssen also zuerst eine DNS-Suche durchführen, indem Sie etwas wie gethostbyname() verwenden.

Es ist immer eine gute Idee, die Rückgabecodes von Funktionen rufen Sie zu überprüfen ...

+0

aber ich bin ein 1 in dem beiden Fällen bekommen. Zum Beispiel, wenn ich in der Adresse = "12.2" mache, wird es 1 zurückgeben. Jedoch gibt es keine solche Adresse in meinem Netzwerk. – Tarik

+0

Es ist möglich, dass 'connect()' wegen eines zufälligen Wertes in 's_addr' ok ist. Wie wäre es mit einer tatsächlichen Adresse von etwas in Ihrem lokalen Netzwerk? Und überprüfen Sie den tatsächlichen Wert der zurückgegebenen Fehlercodes, vielleicht Drucken sie mit 'perror()'. Sonst raten Sie nur. – gilez

+0

Können Sie den Code explizit angeben? Thx viel – Tarik