• Linux下获取网络接口ip地址


    Linux 下 可以使用ioctl()函数以及结构体 struct ifreq和结构体struct ifconf来获取网络接口的各种信息。

    如图,有br0和br1两个接口,当前需要获取br1的ip地址(当然其他接口信息如mac、子网掩码等都可以),方法如下:

     具体过程是先通过ictol获取本地的所有接口信息,存放到ifconf结构中,再从其中取出每个ifreq表示的ip信息(一般每个网卡对应一个IP地址,如:”eth0…、eth1…”)。

    头文件:

    1 #include <arpa/inet.h>
    2 #include <net/if.h>
    3 #include <sys/ioctl.h>
    4 #include <sys/socket.h>

    代码:

     1 static int lanGetBr1IpAddr(const char *ifName, char *ipAddr, UINT32 addrLen)
     2 {
     3     int ret = -1;
     4     struct ifreq ifr;
     5     struct sockaddr_in *sin;
     6     int sock;
     7 
     8     printf("ifname:%s", ifr.ifr_name);
     9     sock = socket(AF_INET, SOCK_DGRAM, 0);
    10     strncpy(ifr.ifr_name, ifName, sizeof(ifr.ifr_name));
    11 
    12     if (0 > (ret = ioctl(sock, SIOCGIFADDR, &ifr)))
    13     {
    14         printf("ioctl get SIOCGIFADDR failed!!");
    15         return -1;
    16     }
    17     close(sock);
    18 
    19     sin = (struct sockaddr_in *)&(ifr.ifr_addr);
    20     if (NULL == inet_ntoa(sin->sin_addr))
    21     {
    22         return -1;
    23     }
    24     strncpy(ipAddr, inet_ntoa(sin->sin_addr), addrLen);
    25 
    26     return ret;
    27 }

    获取成功存入数据库并给前台:

    写这段代码的时候遇到个小问题,本来想打印未经转换的IP地址 sin_addr,一直不成功,实际上这时候的地址是整型

    typedef uint32_t in_addr_t;
    struct in_addr
      {
        in_addr_t s_addr;
      };
  • 相关阅读:
    事件的解除与绑定
    JavaScript 继承
    left 和 margin-left
    表格 DOM 操作
    基于继承的拖拽
    碰撞运动
    弹性运动
    完美运动框架
    JS 操作 Cookie
    DIV拖拽
  • 原文地址:https://www.cnblogs.com/xuqiushuo/p/10246612.html
Copyright © 2020-2023  润新知