C 激活网卡并配置IP与子网掩码

Posted 我要出家当道士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 激活网卡并配置IP与子网掩码相关的知识,希望对你有一定的参考价值。

1、background

        最近项目中需要接入tun,我将wireguard中的tun模块(GO版本)摘了出来,在里面拔了半天没发现有设置网络地址信息的接口,只有根据interfaceName创建tun的接口,所以剩下的事情只能自己做了:激活网卡,设置IP和子网掩码。

        我使用的C编写的接口,使用Go的import C调用。

2、代码

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <net/route.h>
int setIfaceAddress(unsigned char *ifname, unsigned char *ipAddr, unsigned char *mask)
{
 int fd, res = 0;
 struct ifreq ifr;
 struct sockaddr_in *sin;
 struct rtentry  rt;
 fd = socket(AF_INET, SOCK_DGRAM, 0);
 memset(&ifr,0,sizeof(ifr));
 strcpy(ifr.ifr_name,ifname);

 //set nic up
 ioctl(fd, SIOCGIFFLAGS, &ifr);
 ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
 ioctl(fd, SIOCSIFFLAGS, &ifr);

 sin = (struct sockaddr_in*)&ifr.ifr_addr;
 sin->sin_family = AF_INET;

 //set ip
 inet_aton(Ipaddr,&(sin->sin_addr));
 res = ioctl(fd,SIOCSIFADDR,&ifr);
 if (res < 0) return -1;

 //set netmask
 inet_aton(mask,&(sin->sin_addr));
 res = ioctl(fd, SIOCSIFNETMASK, &ifr);
 if (res < 0) return -2;

 close(fd);
 return res;
}

以上是关于C 激活网卡并配置IP与子网掩码的主要内容,如果未能解决你的问题,请参考以下文章

Linux配置网络参数之IP地址、子网掩码、网关地址,DNS

想写个shell脚本来自动配置ip,子网掩码和网关

主机ip子网掩码 默认网关最后不是0,1。 linux的ip怎么设置?

配置网卡

Linux中,怎样永久修改IP和子网掩码

linux 网络配置中BOOTPROTO=none 是啥意思, 使用这样的配置后对网络有啥影响