linux下使用代码设置ip

一、linux下设置ip的几种方式

在 Linux 系统中,设置 IP 地址有多种方法,具体取决于你使用的网络管理工具和配置文件。以下是常见的几种方式:

1、使用ip命令设置临时IP地址

ip命令是现代Linux中用于配置网络接口的推荐方法。

查看网络接口:

ip a

7a96772aa1a0c68fb791fe5ba6f5a6af.png

设置临时IP地址:

sudo ip addr add 192.168.1.100/24 dev eth0

这将为eth0网络接口设置 IP地址192.168.1.100,子网掩码为255.255.255.0。

删除 IP 地址:

sudo ip addr del 192.168.1.100/24 dev eth0

设置网关:

sudo ip route add default via 192.168.1.1

查看路由表:

ip route show

2、使用 ifconfig 命令设置临时 IP 地址    

ifconfig 是旧版工具,但依然广泛使用。

查看网络接口

ifconfig

6702ee49dba91f85fbb453f385d53734.png

设置临时 IP 地址:

sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0

设置网关:

sudo route add default gw 192.168.1.1

3、修改 /etc/network/interfaces 文件(适用于 Debian/Ubuntu 系统)   

对于一些 Linux 发行版(如 Ubuntu 14.04 及其之前版本),网络配置通常保存在 /etc/network/interfaces 文件中。

编辑配置文件:

sudo nano /etc/network/interfaces

添加或修改配置:

auto eth0iface eth0 
inet static address 192.168.1.100 
netmask 255.255.255.0
gateway 192.168.1.1

重新启动网络服务:

sudo service networking restart

或者重新启动整个系统来使配置生效。    

4、使用 Netplan(适用于 Ubuntu 18.04 及以后的版本)

   Ubuntu 18.04 及更高版本使用 Netplan 来配置网络接口。

       编辑 /etc/netplan/*.yaml 配置文件:

sudo nano /etc/netplan/01-netcfg.yaml

示例配置:

network:

  version: 2

  renderer: networkd

  ethernets:

    eth0:

      dhcp4: no

      addresses:

        - 192.168.1.100/24

      gateway4: 192.168.1.1

      nameservers:

        addresses:

          - 8.8.8.8

          - 8.8.4.4

应用配置:

sudo netplan apply

5、使用代码设置ip    

std::cout << "hello world" << std::endl;     
struct ifreq ifr;                           /* interface request */  
uint8_t sIpAddr[16];                        /* source IP address */    
int sd;                                     /* socket descriptor */  struct rtentry route;                       /* route entry */    
int ret = 0;                                /* return value */  struct sockaddr_in *pAddr;                  /* address data */    
uint32_t addrIp =   0xC0A80003;               /* 192.168.0.3  */    
uint32_t addrMask = 0xFFFFFF00;               /* 255.255.255.0 */    
uint32_t addrGw =   0x00000000;               /* 0.0.0.0 */    
sd = socket(AF_INET, SOCK_DGRAM, 0);    
if (-1 == sd) {       
 printf("opening socket failed: %s", strerror(errno));       
 return -1;    }    
/* initialize control data */    
memset(&ifr, 0, sizeof(struct ifreq));   
 memset(&route, 0, sizeof(route));        
strcpy(ifr.ifr_name, NIC);    
ifr.ifr_addr.sa_family = AF_INET;    
pAddr = (struct sockaddr_in *) &ifr.ifr_addr;    /* set IPv4 address */    sprintf((char *) sIpAddr, "%d.%d.%d.%d", (addrIp >> 24) & 0xff, (addrIp >> 16) & 0xff, (addrIp >> 8) & 0xff, addrIp & 0xff);   
 inet_pton(AF_INET, (char *) sIpAddr, &pAddr->sin_addr);   
 ret = ioctl(sd, SIOCSIFADDR, &ifr, sizeof(struct ifreq));    
if (-1 == ret) {        
printf("Could not set IPv4 address: %s", strerror(errno));  
      printf("please check permissions (root)");      
  close(sd);       
 return -1;    
}   
 /* set netmask if not empty */   
 if (0 != addrMask) {  
      sprintf((char *) sIpAddr, "%d.%d.%d.%d",  (addrMask >> 24) & 0xff, 
(addrMask >> 16) & 0xff, (addrMask >> 8) & 0xff, addrMask & 0xff);            inet_pton(AF_INET, (char *) sIpAddr, &pAddr->sin_addr);        
ret = ioctl(sd, SIOCSIFNETMASK, &ifr, sizeof(struct ifreq));      
  if (-1 == ret) {          
  printf("Could not set netmask: %s", strerror(errno));        
    close(sd);           
 return -1;        }  
  }   
 /* set gateway if new address isn't 0.0.0.0 */  
  if (0 != addrGw) {       
 pAddr = (struct sockaddr_in *) &route.rt_gateway;     
   pAddr->sin_family = AF_INET;       
 pAddr->sin_addr.s_addr = INADDR_ANY;        /* allow every routing destination */        pAddr = (struct sockaddr_in *) &route.rt_dst;     
   pAddr->sin_family = AF_INET;     
   pAddr->sin_addr.s_addr = INADDR_ANY;        /* set mask to generic */         
   pAddr = (struct sockaddr_in *) &route.rt_genmask;     
   pAddr->sin_family = AF_INET;       
 pAddr->sin_addr.s_addr = INADDR_ANY;        /* set interface name by using ifr.ifr_name as temp var */       
 strcpy(ifr.ifr_name, NIC);      
 route.rt_dev = ifr.ifr_name;        /* route flags */    
 route.rt_flags = RTF_UP | RTF_GATEWAY;     
 route.rt_metric = 0;     /* clear default gateway (return value is not relevant) */     
   ioctl(sd, SIOCDELRT, &route);        /* set new default gateway */     
   pAddr = (struct sockaddr_in *) &route.rt_gateway;     
   pAddr->sin_family = AF_INET;   
     pAddr->sin_addr.s_addr = (addrGw);        /* assign new default gateway */        ret = ioctl(sd, SIOCADDRT, &route);         
   if (-1 == ret) {     
       printf("could not add default gateway: %s (%i)", strerror(errno), errno);        }    
}  
  /* close socket */   
 close(sd); 
std::cout << "endl" << std::endl ;

如需代码设置与获取ip的程序,可赞赏后在公众号后台留言“code set ip”.

欢迎关注:

其他网络相关基础:

记一次网络无法ping通的排查

1_linux系统网络性能如何优化——几种开源网络协议栈比较

7_计算机网络五层体系结构

Modbus发送的报文何时等到应答

tcp通信测试报告单1——connect和send

libmodbus库的一些使用经历

6_协议与层次划分

5_计算机网络体系结构的形成

4_计算机网络在我国的发展_20241024

3_路由器分组交换知多少?20241009

2_互联网概述_20241007

1_计算机网络体系结构的形成_20241006

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值