精华内容
下载资源
问答
  • Python 获取本机公网IPv6地址

    千次阅读 2020-06-12 23:34:50
    可能会得到一长一短还有一个临时的IPv6地址本机出口默认使用临时地址),经过实际测试,发现长IPv6地址是比较稳定的(不易发生变化),因此主要想办法获取这个长的IPv6地址就行。 2. 获取长地址 # coding=utf-8 ...

    1. 按

    运行

    ipconfig /all
    

    可能会得到一长一短还有一个临时的IPv6地址(本机出口默认使用临时地址),经过实际测试,发现长IPv6地址是比较稳定的(不易发生变化),因此主要想办法获取这个长的IPv6地址就行。
    在这里插入图片描述

    2. 获取长地址

    import os
    import re
    
    
    def getIPv6Address():
        output = os.popen("ipconfig /all").read()
        # print(output)
        result = re.findall(r"(([a-f0-9]{1,4}:){7}[a-f0-9]{1,4})", output, re.I)
        return result[0][0]
    
    
    if __name__ == "__main__":
        print(getIPv6Address())
    

    3. 获取短地址

    import os
    import re
    
    
    def getIPv6Address():
        output = os.popen("ipconfig /all").read()
        # print(output)
        result = re.findall(r"IPv6 地址 . . . . . . . . . . . . : ([a-f0-9:]*::[a-f0-9:]*)", output, re.I)
        return result
    
    
    if __name__ == "__main__":
        print(getIPv6Address())
    
    

    4. 访问ident.me的api获取临时地址

    import requests
    
    
    def getIPv6Address():
        text = requests.get('https://v6.ident.me').text
        return text
    
    
    if __name__ == "__main__":
        print(getIPv6Address())
    

    5. 访问工信部网站的api获取临时地址

    import requests
    
    
    def getIPv6Address():
        text = requests.get('http://getip6.china-ipv6.cn:5010/').text
        return text
    
    
    if __name__ == "__main__":
        print(getIPv6Address())
    
    展开全文
  • 可以使用ioctl函数等方法, 但是要获取IPv6地址, 以前的一些方法就不一定适合, 从网上查找了很多方法, 有两种我试过都可以得到相应的IPv6地址, 此处直接以一段代码做示例展示如何获取指定接口的(IPv6)本地链路地址...

    Linux系统中需要编程获取某个接口的IPv4地址比较常见, 可以使用ioctl函数等方法, 但是要获取IPv6地址, 以前的一些方法就不一定适合, 从网上查找了很多方法, 有两种我试过都可以得到相应的IPv6地址, 此处直接以一段代码做示例展示如何获取指定接口的(IPv6)本地链路地址(注意, 前提是你的Linux支持IPv6, 目前流行的大多数Linux系统早已支持IPv6).
    #include <stdio.h>
    #include <string.h>
    #include <error.h>
    #include <stdlib.h>

    #define DEBUG
    //#define UNSUPPORT_IFADDRS

    /* struct in6_addr */
    #include <netinet/in.h>
    /* getifaddrs, freeifaddrs */
    #include <sys/types.h>
    #ifndef UNSUPPORT_IFADDRS
    #include <ifaddrs.h>
    #endif
    /* inet_ntop, inet_pton */
    #include <arpa/inet.h>

    #if defined(DEBUG)
    #define DG(a, b...) printf("[%s][%s][%d]"a, __FILE__, __func__, __LINE__, ##b)
    #else
    #define DG(a, b...)
    #endif

    #define ER(a, b...) printf("[%s][%s][%d]"a, __FILE__, __func__, __LINE__, ##b)

    #ifndef UNSUPPORT_IFADDRS
    /**
     * Whlie head file  is not existed in you include directory, just define
     * macro UNSUPPORT_IFADDRS to disable this function.
     * Because of function getifaddrs() and freeifaddrs() are declared in this head file,
     * the function can't pass compiling process if lack  in your system.
     */
    int get_linklocal_ipv6addr(struct in6_addr *addr6, char *iface)
    {
        struct ifaddrs *ifa, *p;
        int family;
        char address[200];
        
        if (!addr6 || !iface) {
            ER("addr6 and iface can't be NULL!\n");
            return -1;
        }
        
        if (getifaddrs(&ifa)) {
            ER("");
            perror("getifaddrs error");
            return -1;
        }
        
        for (p = ifa; p != NULL; p = p->ifa_next) {
            DG("ifa_name = %s, family = 0x%X(%s)\n", p->ifa_name, family,
               (family == AF_PACKET) ? "AF_PACKET" :
                                       (family == AF_INET) ?   "AF_INET" :
                                                               (family == AF_INET6) ?  "AF_INET6" : "");
            
            family = p->ifa_addr->sa_family;
            /* Just check IPv6 address */
            if (family != AF_INET6)
                continue;
            
            *addr6 = ((struct sockaddr_in6 *)(p->ifa_addr))->sin6_addr;
            /* Just get IPv6 linklocal address of the interface */
            if (!strcmp(iface, p->ifa_name) && IN6_IS_ADDR_LINKLOCAL(addr6)) {
                if (inet_ntop(AF_INET6, addr6, address, sizeof(address))) {
                    DG("find out %s's linklocal IPv6 address: %s\n", iface, address);
                }
                break;
            }
        }
        
        freeifaddrs(ifa);
        return 0;
    }
    #else
    /**
     * If head file  is not existed in your system, you could get information of IPv6 address
     * in file /proc/net/if_inet6.
     *
     * Contents of file "/proc/net/if_inet6" like as below:
     * 00000000000000000000000000000001 01 80 10 80       lo
     * fe8000000000000032469afffe08aa0f 08 40 20 80     ath0
     * fe8000000000000032469afffe08aa0f 07 40 20 80    wifi0
     * fe8000000000000032469afffe08aa0f 05 40 20 80     eth1
     * fe8000000000000032469afffe08aa0f 03 40 20 80      br0
     * fe8000000000000032469afffe08aa10 04 40 20 80     eth0
     *
     * +------------------------------+ ++ ++ ++ ++    +---+
     * |                                |  |  |  |     |
     * 1                                2  3  4  5     6
     *
     * There are 6 row items parameters:
     * 1 => IPv6 address without ':'
     * 2 => Interface index
     * 3 => Length of prefix
     * 4 => Scope value (see kernel source "include/net/ipv6.h" and "net/ipv6/addrconf.c")
     * 5 => Interface flags (see kernel source "include/linux/rtnetlink.h" and "net/ipv6/addrconf.c" "linux/include/if_addr.h")
     * 6 => Device name
     *
     * Note that all values of row 1~5 are hexadecimal string
     */


    int get_linklocal_ipv6addr(struct in6_addr *addr6, char *iface)
    {
    #define IF_INET6 "/proc/net/if_inet6"
        char str[128], address[64];
        char *addr, *index, *prefix, *scope, *flags, *name;
        char *delim = " \t\n", *p, *q;
        FILE *fp;
        int count;
        
        if (!addr6 || !iface) {
            ER("addr6 and iface can't be NULL!\n");
            return -1;
        }
        
        if (NULL == (fp = fopen(IF_INET6, "r"))) {
            ER("");
            perror("fopen error");
            return -1;
        }
        
    #define IPV6_ADDR_LINKLOCAL 0x0020U
        while (fgets(str, sizeof(str), fp)) {
            DG("str:%s", str);
            addr = strtok(str, delim);
            index = strtok(NULL, delim);
            prefix = strtok(NULL, delim);
            scope = strtok(NULL, delim);
            flags = strtok(NULL, delim);
            name = strtok(NULL, delim);
            DG("addr:%s, index:0x%s, prefix:0x%s, scope:0x%s, flags:0x%s, name:%s\n",
               addr, index, prefix, scope, flags, name);
            
            if (strcmp(name, iface))
                continue;
            
            /* Just get IPv6 linklocal address */
            if (IPV6_ADDR_LINKLOCAL != (unsigned int)strtoul(scope, NULL, 16))
                continue;
            
            memset(address, 0x00, sizeof(address));
            p = addr;
            q = address;
            count = 0;
            while (*p != '') {
                if (count == 4) {
                    *q++ = ':';
                    count = 0;
                }
                *q++ = *p++;
                count++;
            }
            DG("find out %s's linklocal IPv6 address: %s\n", iface, address);
            
            inet_pton(AF_INET6, address, addr6);
            break;
        }
    #undef IPV6_ADDR_LINKLOCAL
        
        fclose(fp);
        return 0;
    }
    #endif

    int main (int argc, char *argv[])
    {
        struct in6_addr addr6;
        char *ifname = "eth0";
        char address[64];
        
        if (get_linklocal_ipv6addr(&addr6, ifname)) {
            printf("\nGet IPv6 linklocal address of %s failed :(\n", ifname);
            return -1;
        }
        if (inet_ntop(AF_INET6, &addr6, address, sizeof(address)))
            printf("\nIPv6 linklocal address of %s is %s :)\n", ifname, address);
        
        return 0;
    }

     

    注意:

    关于Interface flags

    /* ifa_flags */
    #define IFA_F_SECONDARY  0x01
    #define IFA_F_TEMPORARY  IFA_F_SECONDARY

    #define IFA_F_NODAD  0x02
    #define IFA_F_OPTIMISTIC 0x04
    #define IFA_F_HOMEADDRESS 0x10
    #define IFA_F_DEPRECATED 0x20
    #define IFA_F_TENTATIVE  0x40
    #define IFA_F_PERMANENT  0x80

    一般请情况下flag的值应为0x80,如果为其他值应该怀疑interface在init的时候是否有起来

    bug record:

    flag=0xc0, init 不对,导致这个interface sendmsg 出错(22)

     

    转自:http://yangxy84.blog.163.com/blog/static/708443020119171265179/

    展开全文
  • 返回本机IP地址本地IP地址,获得本机ipv6地址,检查本机ipv4,ipv6地址的网站,域名 都是我在网上找的 ipv4 https://ipv4.ddnspod.com https://api-ipv4.ip.sb/ip https://myip.ipip.net ... ipv6 ...

    返回本机IP地址本地IP地址,获得本机的ipv6地址,检查本机ipv4,ipv6地址的网站,域名

    都是我在网上找的

    ipv4

    https://ipv4.ddnspod.com
    https://api-ipv4.ip.sb/ip
    https://myip.ipip.net
    https://ddns.oray.com/checkip
    https://speed.neu.edu.cn/getIP.php
    

    ipv6

    https://ipv6.ddnspod.com
    https://api-ipv6.ip.sb/ip
    https://v6.myip.la/json
    https://speed.neu6.edu.cn/getIP.php
    

    Linux server的话可以用Python写个爬虫就可以得到自己的公网IP地址了

    展开全文
  • 其实是只想获取IPv6地址的,不过我猜想它们差不多,也确实看到不少相关搜索结果,于是顺带着看了。 首先,使用gethostbyname查自己通常是不行的,因为可能得到127.0.0.1,而且我猜,这样不能处理拥有多个IPv4地址...

    首先,我要通过编程直接获取,而不是去读诸如ifconfig等命令的输出。

    其实是只想获取IPv6地址的,不过我猜想它们差不多,也确实看到不少相关搜索结果,于是顺带着看了。

    首先,使用gethostbyname查自己通常是不行的,因为可能得到127.0.0.1,而且我猜,这样不能处理拥有多个IPv4地址的情况。另外一种方式是连上某个主机,然后调用getsockname。这样需要能够直接连上那个主机,好处是如果有多个网络接口,这样可以知道到底走的是哪个接口,调试网络时不错。我最满意的方案在这里,使用ioctl来获取。这个方法可以获取指定网络接口的IPv4地址。至于有哪些网络接口嘛,直接读/proc/net/dev吧。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    import fcntl
    import socket
    import struct
    ifname = b 'eth0'
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 0x8915 是 SIOCGIFADDR
    ip = socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915 , struct.pack( '256s' , ifname[: 15 ]))[ 20 : 24 ])
    print (ip)

    然而,这样只能获取IPv4地址。创建个AF_INET6的 socket 传过去会报错「Inappropriate ioctl for device」。那怎么办呢?Google 没找到,我去搜了下内核源码。inet_ioctl里有对SIOCGIFADDR的处理。但是,inet6_ioctl里却没有了。

    于是,我只好去下载ifconfig所属的 net-tools 的源码,找到相关代码:

    ?
    lib/interface.c (部分)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #if HAVE_AFINET6
         /* FIXME: should be integrated into interface.c.   */
     
         if ((f = fopen (_PATH_PROCNET_IFINET6, "r" )) != NULL) {
         while ( fscanf (f, "%4s%4s%4s%4s%4s%4s%4s%4s %08x %02x %02x %02x %20s\n" ,
                   addr6p[0], addr6p[1], addr6p[2], addr6p[3],
                   addr6p[4], addr6p[5], addr6p[6], addr6p[7],
               &if_idx, &plen, &scope, &dad_status, devname) != EOF) {
             if (! strcmp (devname, ptr->name)) {
             sprintf (addr6, "%s:%s:%s:%s:%s:%s:%s:%s" ,
                 addr6p[0], addr6p[1], addr6p[2], addr6p[3],
                 addr6p[4], addr6p[5], addr6p[6], addr6p[7]);

    这里就是ifconfig输出IPv6部分的代码了。可以看到它打开了一个奇怪的文件。跟过去,发现是

    ?
    1
    #define _PATH_PROCNET_IFINET6       "/proc/net/if_inet6"

    囧,这个文件我早就发现过了的。看来和IPv4的情况不同,IPv6地址只能通过/proc里的文件获取了。而且输出成人可读格式不容易(ifconfig是自己实现的)。

    PS: 我还发现了件好玩的事,在 Linux 源码的include/linux/sockios.h中,SIOCGIFINDEX中的字母 C 写漏了。通过git blame我发现,这个拼写错误在至少七年前 Linux 内核代码迁移到 git 前就修正了。Linus Torvalds 说之前的代码导入到 git 后有 3.2GB。我不得不承认这是个无比正确的决定,因为现在的.git已经有600多兆了,git 不支持断点续传,clone 下来已经很不容易了。

    另外,我还联想到了 Unix 系统调用中的creat,以及 HTTP 协议中的referer :D

    ?
    1
    2
    #define SIOCGIFINDEX    0x8933      /* name -> if_index mapping */
    #define SIOGIFINDEX SIOCGIFINDEX    /* misprint compatibility :-)  
    展开全文
  • 获取接口所有IPV6地址和前缀的方法

    万次阅读 2017-04-05 17:37:29
    获取接口IPV6地址和前缀一共有如下3种方法: 1. 通过ifconfig 2. 通过getifaddr函数 3. 通过cat /proc/net/if_inet6第一种和第三种都类似于读文件,下面主要看一下第二种方法的代码示例:/********************...
  • 要想得到真正的网络ip地址要通过下面的方法:首先新建一个工程,修改AndroidManifest.xml文件增加用户权限,如下: //必写 //必写 主要函数代码如下:// 得到本机ip地址 public String getLocalHostIp() { String ip...
  • c#中获取本机所有的IPv6地址

    千次阅读 2007-03-01 09:50:00
    下述代码中,textBox2是一文本框,用于显示每个接口的描述字串,ipListComb是一组合列表框,存放所获得的IP地址.private void DisplayAllAddresses() { NetworkInterface[] adapters = NetworkInterface.
  • 获取ipv6地址

    千次阅读 2017-06-20 08:56:05
    /************************************************************  Copyright (C), 2017, Leon, All Rights ... FileName: get_if_addr.c Description: 获取接口地址 Author: Leon Version: 1.0 Date: Func
  • Android 通过Java方法获取所有IPv6地址

    万次阅读 2018-08-13 11:24:38
    最近做项目的时候,客户要求Setting中将所有的IPv6地址都能够显示出来,目前通过Android标准接口只能获取一个IPv6地址,但是安卓设备可能有多个IPv6地址。为此我们首先想到利用ifconfig去获取,但是用java代码执行...
  • ipv6地址获取协议 内容精选换一换IPv6的使用,可以有效弥补IPv4网络地址资源有限的问题。如果当前云服务器使用IPv4,那么启用IPv6后,云服务器可在双栈模式下运行,即云服务器可以拥有两个不同版本的IP地址:IPv4...
  • 下面显示了如何获取本机上所有网络接口及IP地址的相关信息 它们层次关联为: 一个本机可以有多个网络接口,这些接口包括实际接口与虚拟接口。 每个网络接口可以得到多个IP地址,可能是IPV4也可能是IPV6。 得到本机的...
  • PHP获取IPV6地址

    千次阅读 2019-02-21 21:11:28
    首先说几个坑: ...我们之前获取IP的方式 private static function clientIp(){ return getenv('HTTP_CLIENT_IP')?: getenv('HTTP_X_FORWARDED_FOR')?: getenv('HTTP_X_FORWARDED')?: gete...
  • IPv6 地址

    2016-04-30 11:09:10
    第一部分包含地址前缀,第二部分包含接口标识符。表示 IPv6 地址/前缀组合的简明方式如下所示:ipv6 地址/前缀长度。 以下是具有 64 位前缀的地址的示例。 3FFE:FFFF:0:CD30:0:0:0:0/64. 此示例中的前缀是 3FFE
  • WAN6 已自动获取ipv6地址, 无IPv6-PD也可 备份 /etc/config/dhcp cp /etc/config/dhcp /etc/config/dhcp.bak 修改 dhcp 配置 1. 修改 /etc/config/dhcp 有则改之,无则添加。自己稍微检查一下与已有的配置是否...
  • 我试图在我的Linux操作系统中获得IPv6地址,如下所示:sd = Socket_m(AF_INET6_m, SOCK_DGRAM_m, 0); ifc.ifc_buf = buffer_p; ifc.ifc_len = buffSize; Ioctl_m(sd, SIOCGIFCONF, &ifc);如果为接口...
  • IPv6地址

    千次阅读 2018-05-24 21:20:24
    一个因特网协议第6版地址(IPv6地址)是用于标识所涉及的数字标签的网络接口的计算机的一个或网络节点参与一个IPv6的 计算机网络。一个IP地址用于识别的单个网络接口的目的主机,定位在网络上,并且因此允许的路由...
  • linux下获取本机ip地址,ipv4和ipv6

    千次阅读 2012-07-12 10:33:10
    #include #include #include #include #include #include #include #include int GetIP_v4_and_v6_linux(int family, char *address, int size) { struct ifaddrs *ifap0, *ifap;... char b
  • 但这需要有公网的IP地址,我家安装的是移动宽带,然而现在ipv4的公网地址已经快不够用了,想打电话给移动申请公网ipv4地址也许行不通,之前学过一点点网络的皮毛,经过大佬提议,就想要获取ipv6地址 接下来的是关键...
  • 默认情况下Padavan连接到光猫以后,会自动获取并为默认eth3分配WAN口的IP地址,支持IPv6的光猫会获取IPv6地址给WAN口,但是不会继续对LAN中子网设备进行IPv6地址的分配了。 通过ifconfig命令可以得到:小米路由器...
  • shell 获取IPv4和IPv6地址的命令

    千次阅读 2018-04-28 15:24:14
    ip -4 address show | grep inet | grep -v 127.0.0 | awk '{print $2}' | cut -d'/' -f1ip -6 address show | grep inet6 | awk '{print $2}' | cut -d'/' -f1
  • 获取本机所有接口和所有IP地址的函数 最近一直在忙一个程序,为了保护自己机器上所有IP,便要获取它们。 虽然IPv6中根本没有ARP,但是我编写代码的原则一直希望能够独力于协议版本,所以不管怎么说一定要能获取...
  • IPv6 02-IPv6地址配置

    2018-07-27 21:41:00
    IPv6地址配置有两种: 无状态地址自动配置 有状态地址自动配置协议 -- DHCPv6协议 无状态地址自动配置的过程 IPv6主机首先通过路由器发现功能来获取地址前缀信息 通过向接口已有的48bitMAC地址中插入16bit的...
  • 本文没有使用ioctl 函数,未使用socket ,直接获取本地的所有地址,包括IPv4,IPV6,MAC 地址: 核心函数是:getifaddrs() & freeifaddrs() 代码如下: #include #include #include #include #include /*-...
  • PC直连Router的接口后可通过协议自动获取IPv6地址,并自动生成默认网关,从而使PC与路由器可以自动连通。具体到该试验中,在路由器使能RA(Router Advertisement,路由器通告)后,PC能够根据接收到的RA报文自动配置...
  • 一、IPv6地址1. IPv6 地址表示方式IPv6 地址被表示为以冒号(:)分隔的一连串 16 比特的十六进制数。每个 IPv6 地址被分为 8 组,每 组 的 16 比 特 用 4 个 十 六 进 制 数 来 表 示 , 组 和 组 之 间 用 冒 号 隔 ...
  • 一、IPv6地址1. IPv6 地址表示方式IPv6 地址被表示为以冒号(:)分隔的一连串 16 比特的十六进制数。每个 IPv6 地址被分为 8 组,每 组 的 16 比 特 用 4 个 十 六 进 制 数 来 表 示 , 组 和 组 之 间 用 冒 号 隔 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,688
精华内容 11,875
热门标签
关键字:

获取本机接口ipv6地址