zoukankan      html  css  js  c++  java
  • (转载)Linux编程获取本机IP地址的三种方法

    (转载)http://blog.csdn.net/jcwKyl/article/details/6324147

    这 是一项不太清晰而且没有多大意义的工作。一个原因是网络地址的设置非常灵活而且都是允许用户进行个性化设置的,比如一台计算机上可以有多块物理网卡或者虚 拟网卡,一个网卡上可以绑定多个IP地址,用户可以为网卡设置别名,可以重命名网卡,用户计算机所在网络拓扑结构未知,主机名设置是一个可选项并且同样可 以为一个计算机绑定多个主机名等,这些信息都会有影响。脱离了网络连接,单独的网络地址没有任何意义。编程中遇到必须获取计算机IP的场景,应该考虑将这 一选项放到配置文件中,由用户自己来选择。

    通过google,编程获取IP地址大约有以下三种思路:
    1. 通过gethostname()和gethostbyname()

    #include <stdio.h>
    #include <unistd.h>
    #include <netdb.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

    int main() {
        char hname[128];
        struct hostent *hent;
        int i;

        gethostname(hname, sizeof(hname));

        //hent = gethostent();
        hent = gethostbyname(hname);

        printf("hostname: %s/naddress list: ", hent->h_name);
        for(i = 0; hent->h_addr_list[i]; i++) {
            printf("%s/t", inet_ntoa(*(struct in_addr*)(hent->h_addr_list[i])));
        }
        return 0;
    }

    运行:
    [whb@jcwkyl c]$ ./local_ip 
    hostname: jcwkyl.jlu.edu.cn
    address list: 10.60.56.90       


    2. 通过枚举网卡,API接口可查看man 7 netdevice

    /*代码来自StackOverflow: http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-computer */
    #include <stdio.h>      
    #include <sys/types.h>
    #include <ifaddrs.h>
    #include <netinet/in.h> 
    #include <string.h> 
    #include <arpa/inet.h>

    int main (int argc, const char * argv[]) {
        struct ifaddrs * ifAddrStruct=NULL;
        void * tmpAddrPtr=NULL;

        getifaddrs(&ifAddrStruct);

        while (ifAddrStruct!=NULL) {
            if (ifAddrStruct->ifa_addr->sa_family==AF_INET) { // check it is IP4
                // is a valid IP4 Address
                tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
                char addressBuffer[INET_ADDRSTRLEN];
                inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
                printf("%s IP Address %s/n", ifAddrStruct->ifa_name, addressBuffer); 
            } else if (ifAddrStruct->ifa_addr->sa_family==AF_INET6) { // check it is IP6
                // is a valid IP6 Address
                tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
                char addressBuffer[INET6_ADDRSTRLEN];
                inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
                printf("%s IP Address %s/n", ifAddrStruct->ifa_name, addressBuffer); 
            } 
            ifAddrStruct=ifAddrStruct->ifa_next;
        }
        return 0;
    }

    运行 :
    [whb@jcwkyl c]$ ./local_ip2 
    lo IP Address 127.0.0.1
    eth0 IP Address 10.60.56.90
    eth0:1 IP Address 192.168.1.3
    lo IP Address ::
    eth0 IP Address ::2001:da8:b000:6213:20f:1fff
    eth0 IP Address 0:0:fe80::20f:1fff

    3. 打开一个对外界服务器的网络连接,通过getsockname()反查自己的IP

  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3055764.html
Copyright © 2011-2022 走看看