Linux下C编程实现---获取本机IP地址

来源:互联网 发布:jdk1.7源码下载 官方 编辑:程序博客网 时间:2024/04/29 21:55

在LINUX下,如果需要获取本机的IP地址,需要用到以下一个结构体,该结构体在/usr/include/net/if.h文件中

struct ifreq  {# define IFHWADDRLEN    6# define IFNAMSIZ   IF_NAMESIZE    union      {    char ifrn_name[IFNAMSIZ];   /* Interface name, e.g. "en0".  */      } ifr_ifrn;    union      {    struct sockaddr ifru_addr;    struct sockaddr ifru_dstaddr;    struct sockaddr ifru_broadaddr;    struct sockaddr ifru_netmask;    struct sockaddr ifru_hwaddr;    short int ifru_flags;    int ifru_ivalue;    int ifru_mtu;    struct ifmap ifru_map;    char ifru_slave[IFNAMSIZ];  /* Just fits the size */    char ifru_newname[IFNAMSIZ];    __caddr_t ifru_data;      } ifr_ifru;  };# define ifr_name   ifr_ifrn.ifrn_name  /* interface name   */# define ifr_hwaddr ifr_ifru.ifru_hwaddr    /* MAC address      */# define ifr_addr   ifr_ifru.ifru_addr  /* address      */# define ifr_dstaddr    ifr_ifru.ifru_dstaddr   /* other end of p-p lnk */# define ifr_broadaddr  ifr_ifru.ifru_broadaddr /* broadcast address    */# define ifr_netmask    ifr_ifru.ifru_netmask   /* interface net mask   */# define ifr_flags  ifr_ifru.ifru_flags /* flags        */# define ifr_metric ifr_ifru.ifru_ivalue    /* metric       */# define ifr_mtu    ifr_ifru.ifru_mtu   /* mtu          */# define ifr_map    ifr_ifru.ifru_map   /* device map       */# define ifr_slave  ifr_ifru.ifru_slave /* slave device     */# define ifr_data   ifr_ifru.ifru_data  /* for use by interface */# define ifr_ifindex    ifr_ifru.ifru_ivalue    /* interface index      */# define ifr_bandwidth  ifr_ifru.ifru_ivalue    /* link bandwidth   */# define ifr_qlen   ifr_ifru.ifru_ivalue    /* queue length     */# define ifr_newname    ifr_ifru.ifru_newname   /* New name     */# define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)# define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)# define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)

从这个结构体,你可以看到ifr_addr就是我们要获取的IP地址,于是编程实现如下

#include <stdio.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#include <net/if.h>#include <sys/ioctl.h>#define IF_NAME "eth0"int get_local_ip(char * ifname, char * ip){    char *temp = NULL;    int inet_sock;    struct ifreq ifr;    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);     memset(ifr.ifr_name, 0, sizeof(ifr.ifr_name));    memcpy(ifr.ifr_name, ifname, strlen(ifname));    if(0 != ioctl(inet_sock, SIOCGIFADDR, &ifr))     {           perror("ioctl error");        return -1;    }    temp = inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr);         memcpy(ip, temp, strlen(temp));    close(inet_sock);    return 0;}int main(void){    char ip[32] = {0};    get_local_ip(IF_NAME, ip);    if(0 != strcmp(ip, ""))        printf("%s ip is %s\n",IF_NAME, ip);    return 0;}
0 0
原创粉丝点击