linux 子网掩码命令,嵌入式linux中,用程序设置IP,子网掩码,网关。

本文档介绍了一个程序,用于在嵌入式Linux系统中优雅地设置网卡的IP地址、子网掩码和网关。通过直接调用ioctl系统调用,而不是传统的ifconfig和route命令,实现了更底层的网络配置操作。程序包含关键步骤如创建套接字、设置接口地址、子网掩码和网关,并更新接口状态。
摘要由CSDN通过智能技术生成

最近有个项目,要求在程序中,对嵌入式linux系统设置网卡的IP地址,子网掩码,网关,虽说直接调用系统自带的ifconfig,route等命令可以实现但总觉得不够优雅,于是写了个利用ioctl直接设置的程序,供大家参考。

#include   #include   #include   #include   #include   #include   #include   #include   //#include

#include #include

#include #include #include #include #include #include

#include

#include #include #include #include #include #include #include #include #include #include #include

//ifname是网卡名,比如eth0,ipaddr是IP地址

int   ifconfig(const   char   *ifname,   const   char   *ipaddr,const char *netmask,const char *gwip)

{

struct   sockaddr_in   sin;

struct   ifreq   ifr;

int   fd;

bzero(&ifr,   sizeof(struct   ifreq));

if   (ifname   ==   NULL)

return   (-1);

if   (ipaddr   ==   NULL)

return   (-1);

if(gwip == NULL)

return(-1);

fd   =   socket(AF_INET,   SOCK_DGRAM,   0);

if   (fd   ==   -1)

{

perror( "Not   create   network   socket   connection\n ");

return   (-1);

}

strncpy(ifr.ifr_name,   ifname,   IFNAMSIZ);

ifr.ifr_name[IFNAMSIZ   -   1]   =   0;

memset(&sin,   0,   sizeof(sin));

sin.sin_family   =   AF_INET;

sin.sin_addr.s_addr   =   inet_addr(ipaddr);

memcpy(&ifr.ifr_addr,   &sin,   sizeof(sin));

if   (ioctl(fd,   SIOCSIFADDR,   &ifr)       {

perror( "Not   setup   interface\n ");

return   (-1);

}

///

bzero(&ifr,   sizeof(struct   ifreq));

strncpy(ifr.ifr_name,   ifname,   IFNAMSIZ);

ifr.ifr_name[IFNAMSIZ   -   1]   =   0;

memset(&sin,   0,   sizeof(sin));

sin.sin_family   =   AF_INET;

sin.sin_addr.s_addr   =   inet_addr(netmask);

memcpy(&ifr.ifr_addr,   &sin,   sizeof(sin));

if(ioctl(fd, SIOCSIFNETMASK, &ifr ) < 0)

{

perror("net mask ioctl error/n");

return (-1);

}

/

struct rtentry rm;

bzero(&rm,   sizeof(struct rtentry));

rm.rt_dst.sa_family = AF_INET;

rm.rt_gateway.sa_family = AF_INET;

rm.rt_genmask.sa_family = AF_INET;

memset(&sin,   0,   sizeof(sin));

sin.sin_family   =   AF_INET;

sin.sin_addr.s_addr   =   inet_addr(gwip);

memcpy(&rm.rt_gateway, &sin,   sizeof(sin));

rm.rt_dev = (char *)ifname;

rm.rt_flags = RTF_UP | RTF_GATEWAY ;

if(ioctl(fd, SIOCADDRT, &rm ) < 0)

{

perror("gateway ioctl error/n");

return (-1);

}

/

ifr.ifr_flags   |=   IFF_UP   |   IFF_RUNNING;

if   (ioctl(fd,   SIOCSIFFLAGS,   &ifr)       {

perror( "SIOCSIFFLAGS ");

return   (-1);

}

return   (0);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值