zoukankan      html  css  js  c++  java
  • 根据网卡名获取IP地址,以及掩码地址

    nterface name is something like “eth0″ and the ip address of the interface can be retrieved using the ioctl function.
    Here is a simple piece of code that demonstrates how :

    Code

    1 #include <stdio.h>
    2 #include <string.h>
    3 #include <sys/types.h>
    4 #include <sys/socket.h>
    5 #include <sys/ioctl.h>
    6 #include <netinet/in.h>
    7 #include <net/if.h>
    8 #include <unistd.h>
    9 #include <arpa/inet.h>
    10  
    11 int main()
    12 {
    13     int fd;
    14     struct ifreq ifr;
    15      
    16     char iface[] = "eth0";
    17      
    18     fd = socket(AF_INET, SOCK_DGRAM, 0);
    19  
    20     //Type of address to retrieve - IPv4 IP address
    21     ifr.ifr_addr.sa_family = AF_INET;
    22  
    23     //Copy the interface name in the ifreq structure
    24     strncpy(ifr.ifr_name , iface , IFNAMSIZ-1);
    25  
    26     ioctl(fd, SIOCGIFADDR, &ifr);
    27  
    28     close(fd);
    29  
    30     //display result
    31     printf("%s - %s\n" , iface , inet_ntoa(( (struct sockaddr_in *)&ifr.ifr_addr )->sin_addr) );
    32  
    33     return 0;
    34 }

    Output

    1 $ gcc ioctl.c && ./a.out
    2 eth0 - 192.168.0.6

    The socket used can be a TCP socket (SOCK_STREAM) as well.

    If you also need the netmask then use the SIOCGIFNETMASK value in ioctl like this :

    1 #include <stdio.h>
    2 #include <string.h>
    3 #include <sys/socket.h>
    4 #include <sys/ioctl.h>
    5 #include <net/if.h>
    6 #include <unistd.h>
    7 #include <arpa/inet.h>
    8  
    9 int main()
    10 {
    11     int fd;
    12     struct ifreq ifr;
    13      
    14     char iface[] = "eth0";
    15      
    16     fd = socket(AF_INET, SOCK_DGRAM, 0);
    17  
    18     //Type of address to retrieve - IPv4 IP address
    19     ifr.ifr_addr.sa_family = AF_INET;
    20  
    21     //Copy the interface name in the ifreq structure
    22     strncpy(ifr.ifr_name , iface , IFNAMSIZ-1);
    23      
    24     //get the ip address
    25     ioctl(fd, SIOCGIFADDR, &ifr);
    26      
    27     //display ip
    28     printf("IP address of %s - %s\n" , iface , inet_ntoa(( (struct sockaddr_in *)&ifr.ifr_addr )->sin_addr) );
    29      
    30     //get the netmask ip
    31     ioctl(fd, SIOCGIFNETMASK, &ifr);
    32      
    33     //display netmask
    34     printf("Netmask of %s - %s\n" , iface , inet_ntoa(( (struct sockaddr_in *)&ifr.ifr_addr )->sin_addr) );
    35      
    36     close(fd);
    37      
    38     return 0;
    39 }

    Output :

    1 $ gcc ioctl.c && ./a.out
    2 IP address of eth0 - 192.168.0.6
    3 Netmask of eth0 - 255.255.255.0
  • 相关阅读:
    Memcached存储溢出
    Memcached windows安装
    Memcached简介
    HTTP请求中怎样选择Get和Post方式
    【cogs 597】【dp】交错匹配
    &lt;LeetCode OJ&gt; 58. Length of Last Word
    codevs1051
    最重要的 Java EE 最佳实践
    android-xBuild apk差分与合成,zip差分与合成,lua打包,apk打包,png/jpg图片压缩
    [Phonegap+Sencha Touch] 移动开发26 Android下的sencha touch程序,转屏时,Ext.Viewport不能触发orientationchange事件的解决的方法
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2586157.html
Copyright © 2011-2022 走看看