Linux下获取网络配置的C语言实现


/**
  * @brief   获取指定网络接口的IP地址
  * @details None.
  * @param   ifname: 网络接口名称.
  * @param   ip: 存储IP地址字符串的起始地址
  * @param   size: 存储空间大小
  * @retval  0:OK.
  */
int get_ip(const char *ifname, char *ip, int size)
{
  int sock;
  struct ifreq ifr;

  sock = socket(AF_INET, SOCK_DGRAM, 0);
  if (sock < 0) {
    return -1;
  }
  strcpy(ifr.ifr_name, ifname);

  ioctl(sock, SIOCGIFADDR, &ifr);
  inet_ntop(AF_INET,&((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr, ip, size);

  close(sock);
  return 0;
}

/**
  * @brief   获取指定网络接口的子网掩码地址
  * @details None.
  * @param   ifname: 网络接口名称.
  * @param   netmask: 存储掩码地址字符串的起始地址
  * @param   size: 存储空间大小
  * @retval  0:OK.
  */
int get_netmask(const char *ifname, char *netmask, int size)
{
  int sock;
  struct ifreq ifr;

  sock = socket(AF_INET, SOCK_DGRAM, 0);
  if (sock < 0) {
    return -1;
  }
  strcpy(ifr.ifr_name, ifname);

  ioctl(sock, SIOCGIFNETMASK, &ifr);
  inet_ntop(AF_INET,&((struct sockaddr_in *)&ifr.ifr_netmask)->sin_addr, netmask, size);

  close(sock);
  return 0;
}

/**
  * @brief   获取默认网关地址
  * @details None.
  * @param   ifname: 网络接口名称.
  * @param   gateway: 存储网关地址字符串的起始地址
  * @param   size: 存储空间大小
  * @retval  0:OK.
  */
int get_gateway(const char *ifname, char *gateway, int size)
{
  int ret=-1;
  FILE *fp;
  char sys_cmd[32];
  char buf[256], *tmp, *p;

  strcpy(sys_cmd, "ip route");
  fp = popen(sys_cmd, "r");
  if (fp == NULL) {
    return -1;
  }
  while(fgets(buf, sizeof(buf), fp) != NULL) {
    tmp = strstr(buf, "default");
    p = strstr(buf, ifname);
    if(tmp && p) {
      p = strstr(tmp, "via ");
      if (p != NULL) {
        p+=4;
        tmp = strchr(p, ' ');
        if (tmp != NULL) {
          *tmp = '\0';
        }
        snprintf(gateway, size, "%s", p);
        ret = 0;
      }
      break;
    }
  }
  pclose(fp);
  return ret;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值