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
  • 相关阅读:
    0015 Java学习笔记-集合-TreeMap集合
    0014 Java学习笔记-集合-HashMap集合
    0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
    0012 win7x64安装CentOS7
    0011《SQL必知必会》笔记07 数据的插入、更新和删除
    0010《SQL必知必会》笔记06-表的修改与删除
    0009《SQL必知必会》笔记05-表的创建与约束
    0008《SQL必知必会》笔记04-子查询、联接与组合查询
    0007《SQL必知必会》笔记03-汇总与分组数据
    0006 《SQL必知必会》笔记02-计算字段与函数
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2586157.html
Copyright © 2011-2022 走看看