在Linux下获取关于IP和网关的操作:重点是对struct ifreq 的操作。

那么进入目录/usr/include/net/if.h下看查找struct ifreq结构体。

/* Interface request structure used for socket ioctl's.  All interface
   ioctl's must have parameter definitions which begin with ifr_name.
   The remainder may be interface specific.  */

struct ifreq
  {
# define IFHWADDRLEN
# 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(,,)
# define _IOT_ifreq_short _IOT(_IOTS(,,)
# define _IOT_ifreq_int _IOT(_IOTS(,,)

看完这个,结构体的内容一目了然

1.获取ip

int get_local_ip(char * dev_name, char * addr)
{
    int ret;
    int sockfd;
    struct sockaddr_in sin;
    struct ifreq req;

    if(dev_name == NULL)
    {
        error_exit("dev_name");
    }

    )) < )
    {
        error_exit("ip socket");
    }
    strcpy(req.ifr_name, dev_name);

    ret = ioctl(sockfd,SIOCGIFADDR,&req);
    )
    {
        memcpy(&sin, &req.ifr_addr,sizeof(sin));
        printf("local IP:%s\n",inet_ntoa(sin.sin_addr));
    }

    close(sockfd);
    ;
}

2.设置ip

#define error_exit(_errmsg_)     \
    error(EXIT_FAILURE, errno, _errmsg_)

#define MAC_ADDR_LEN 6

int set_local_ip(char * dev_name, const char * ip_addr)
{
    int ret;
    int sockfd;
    struct sockaddr_in set_ip;
    struct ifreq req;

    if(ip_addr == NULL)
    {
        error_exit("ip_addr invalid");
    }
    )) < )
    {
        error_exit("ip socket");
    }
    bzero(&req, sizeof(req));
    strncpy(req.ifr_name, dev_name, strlen(dev_name) );

    bzero(&set_ip, sizeof(set_ip));
    set_ip.sin_family = AF_INET;
    set_ip.sin_addr.s_addr = inet_addr(ip_addr);

    memcpy(&req.ifr_addr, &set_ip, sizeof(set_ip));

    ret = ioctl(sockfd,SIOCSIFADDR,&req);
    )
    {
        error_exit("set IP...");
    }

    close(sockfd);
    ;
}

整个demo为:

int main()
{
    char * dev_name = "eth1";
    ] = "192.168.123.100";
    set_local_ip(dev_name, ip_addr);
    ;
}    

Linux下获取和设置IP的更多相关文章

  1. Linux下获取本机IP地址的代码

    Linux下获取本机IP地址的代码,返回值即为互联网标准点分格式的字符串. #define ETH_NAME "eth0" //获得本机IP地址 char* GetLocalAdd ...

  2. linux下获取本机IP

    转载:http://blog.chinaunix.net/uid-20593763-id-1620213.html 源代码级Unix/Linux 通用网卡IP地址获取方法 在Unix和Linux系统下 ...

  3. Linux 下获取本机IP

    http://blog.csdn.net/K346K346/article/details/48231933 int main () { /* struct ifaddrs *ifap, *ifa; ...

  4. linux下获取外网IP

    使用阿里云或者有多个网卡IP的机器需要取外网IP时,可以用下面这种 wget -qO - ifconfig.co 更多方法参考:https://yq.aliyun.com/ziliao/105999

  5. Linux 下获取LAN中指定IP的网卡的MAC(物理地址)

    // all.h// 2005/06/20,a.m. wenxy #ifndef _ALL_H#define _ALL_H #include <memory.h>#include < ...

  6. Windows下获取本机IP地址方法介绍

    Windows下获取本机IP地址方法介绍 if((hostinfo = gethostbyname(name)) != NULL) { #if 1 ; printf("IP COUNT: % ...

  7. Linux下获取硬盘使用情况

    Linux下获取硬盘使用情况[总结] 1.前言 在嵌入式设备中,硬盘空间非常有限,在涉及到经常写日志的进程时候,需要考虑日志的大小和删除,不然很快就硬盘写满,导致日志程序崩溃.为了捕获硬盘写满的异常场 ...

  8. MongoDB在Linux下常用优化设置

    MongoDB在Linux下常用优化设置 以下是一些MongoDB推荐的常用优化设置.在生产环境下选取合适的参数值,例如预读值和默认文件描述符数目等,会对系统性能有很大的影响. 1.关闭数据库文件的 ...

  9. .net core在Linux下获取AD域信息

    .net core在Linux下获取AD域信息 .net Core 2.1.4 .net core现在System.DirectoryServices只支持Windows平台下使用. 参考: http ...

随机推荐

  1. Tengine,轻量级Web服务器

    阿里妹导读:Tengine,轻量级Web服务器,基于Nginx进行开发,针对大访问量网站的需求,新增了很多高级功能和特性.比如,Tengine兼容Nginx的所有配置,并且增加了独立进程框架.页面优化 ...

  2. 【IOI 2018】Werewolf 狼人

    虽然作为IOI的Day1T3,但其实不是一道很难的题,或者说这道题其实比较套路吧. 接下来讲解一下这个题的做法: 如果你做过NOI 2018的Day1T1,并且看懂了题面,那你很快就会联想到这道题,因 ...

  3. 【Cf #292 D】Drazil and Morning Exercise(树的直径,树上差分)

    有一个经典的问题存在于这个子问题里,就是求出每个点到其他点的最远距离. 这个问题和树的直径有很大的关系,因为事实上距离每个点最远的点一定是直径的两个端点.所以我们可以很容易地进行$3$遍$Dfs$就可 ...

  4. Paxos Made Simple【翻译】

    Paxos一致性算法——分布式系统中的经典算法,论文本身也有一段有趣的故事.一致性问题是分布式系统的根本问题之一,在论文中,作者一步步的加强最初一致性问题(2.1节提出的问题)的约束条件,最终导出了一 ...

  5. MyBatis.2剖析

    上次给大家介绍了一下properties 和 environments 的配置, 接下来就正式开始看源码了: 上次例子中,我们以 SqlSessionFactoryBuilder 去创建 SqlSes ...

  6. 用递归的方法求一个数组的前n项和

    用递归的方法求一个数组的前n项和 public class Demo1 { /* * 用递归的方法求一个数组的前n项和 */ public static void main(String[] args ...

  7. MySQL服务无法启动,错误代码1067

    偶然间一次服务器意外重启 重启过后发现MySQL服务停止 手动启动之,发现无法启动 错误代码1067,进程意外终止 遂开始排查问题,首先想到的可能就是my.ini文件出了问题 但是已经忘了写过什么东西 ...

  8. 【转】(总结)Nginx配置文件nginx.conf中文详解

    本文转载自:http://www.ha97.com/5194.html 定义Nginx运行的用户和用户组 user www www; nginx进程数,建议设置为等于CPU总核心数 worker_pr ...

  9. Linux 常见文件及目录

    文件/etc//etc/passwd用户基本信息/etc/group用户组基本信息/etc/shadow/etc/passwd 文件的补充/etc/gshadow阴影口令套组中的组配置文件/etc/l ...

  10. python学习笔记5--random

    一.random模块 import random,string print(random.randint(1,199))#1-199随机取一个整数 print(string.digits) #所有的数 ...