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