ICMP套接字(赢)

时间:2016-09-29 18:01:31

标签: c sockets winsock2 icmp

如果地址为up,我想将程序设为checknet,如果它返回0则返回1.这是代码:

#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

1 个答案:

答案 0 :(得分:0)

您正在将字符串"www.stackoverflow.com"传递给函数inet_addr()。这个函数需要一个&#34; IPv4数字和点符号&#34;地址,例如151.101.1.69 - 所以你需要先使用gethostbyname()之类的东西进行DNS查找。

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