2016-09-29 53 views
0

我想做一个程序作为checknet如果ADRESS高达返回1,如果是向下返回0。这里是代码:ICMP插座(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"); 

} 

当我连接到互联网它返回1,但即使我没有连接也返回1,但它应该返回0. THX

回答

0

您正在传递字符串"www.stackoverflow.com"功能inet_addr()。这个函数需要一个“IPv4数字和点的符号”地址,如151.101.1.69 - 所以你需要先使用类似gethostbyname()的东西进行DNS查找。

检查你所调用的函数的返回码总是一个好主意...

+0

但是我在这两种情况下都得到1。例如,如果我在地址=“12.2”中设置,它将返回1.但是在我的网络中没有这样的地址。 – Tarik

+0

由于's_addr'中的一些随机值,'connect()'可能返回OK。如何使用本地网络上的实际地址?并检查返回的错误代码的实际值,也许用'perror()'打印它们。否则你只是在猜测。 – gilez

+0

你可以明确的代码。 Thx很多 – Tarik