一、linux下设置ip的几种方式
在 Linux 系统中,设置 IP 地址有多种方法,具体取决于你使用的网络管理工具和配置文件。以下是常见的几种方式:
1、使用ip
命令设置临时IP地址
ip
命令是现代Linux中用于配置网络接口的推荐方法。
查看网络接口:
ip a
设置临时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
设置临时 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”.
欢迎关注:
其他网络相关基础: