如下为C++代码
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <unistd.h> // Add this header for 'close' function
#include <stdio.h>
#define MAX_IFS_NUM 64
#define MAC_ADDR_LEN 6
#define IP_ADDR_LEN 4
struct netif_info{
char ifname[IFNAMSIZ];
char ifreal[IFNAMSIZ];
unsigned char macaddr[IFHWADDRLEN];
int ifindex;
in_addr_t ip;
in_addr_t mask;
short int flags;
};
int GetNetifList(netif_info netifs[MAX_IFS_NUM], int &num) {
int ret = 0;
int sockfd;
struct ifconf ifc;
struct ifreq ifs[MAX_IFS_NUM];
struct ifreq ifr;
struct sockaddr_in *addr;
int nsize;
num = 0;
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (sockfd == -1)
return -1;
ifc.ifc_len = sizeof(ifs);
ifc.ifc_req = ifs;
if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) {
ret = -2;
goto exit;
}
nsize = ifc.ifc_len / sizeof(struct ifreq);
if (nsize > MAX_IFS_NUM) {
ret = -3;
goto exit;
}
for (int n = 0; n < nsize; ++n) {
ifr = ifc.ifc_req[n];
strncpy(netifs[num].ifname, ifr.ifr_name, IFNAMSIZ);
strncpy(netifs[num].ifreal, ifr.ifr_name, IFNAMSIZ); // Assuming ifname and ifreal are the same initially
if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) {
ret = -7;
goto exit;
}
netifs[num].flags = ifr.ifr_flags;
// Get IP address
if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0) {
netifs[num].ip = 0;
} else {
addr = (struct sockaddr_in*)&ifr.ifr_addr;
netifs[num].ip = addr->sin_addr.s_addr;
}
// Get subnet mask
if (ioctl(sockfd, SIOCGIFNETMASK, &ifr) < 0) {
netifs[num].mask = 0;
} else {
addr = (struct sockaddr_in*)&ifr.ifr_netmask;
netifs[num].mask = addr->sin_addr.s_addr;
}
if (ioctl(sockfd, SIOCGIFINDEX, &ifr) < 0) {
ret = -5;
goto exit;
}
netifs[num].ifindex = ifr.ifr_ifindex;
if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) {
ret = -8;
} else {
memcpy(netifs[num].macaddr, ifr.ifr_hwaddr.sa_data, MAC_ADDR_LEN);
}
++num;
}
exit:
close(sockfd);
return ret;
}
int main() {
int num;
netif_info netifs[MAX_IFS_NUM];
int ret = GetNetifList(netifs, num);
if (ret != 0) {
std::cerr << "Failed to get network interface list. Error code: " << ret << std::endl;
return ret;
}
std::cout << "Number of network interfaces: " << num << std::endl;
std::cout << "---------------------------------" << std::endl;
for (int i = 0; i < num; ++i) {
std::cout << "Interface Name: " << netifs[i].ifname << std::endl;
std::cout << "IP Address: ";
for (int j = 0; j < IP_ADDR_LEN; ++j) {
std::cout << ((netifs[i].ip >> (j * 8)) & 0xFF);
if (j < IP_ADDR_LEN - 1) {
std::cout << ".";
}
}
std::cout << std::endl;
std::cout << "Subnet Mask: ";
for (int j = 0; j < IP_ADDR_LEN; ++j) {
std::cout << ((netifs[i].mask >> (j * 8)) & 0xFF);
if (j < IP_ADDR_LEN - 1) {
std::cout << ".";
}
}
std::cout << std::endl;
std::cout << "Interface Index: " << netifs[i].ifindex << std::endl;
std::cout << "MAC Address: ";
for (int j = 0; j < MAC_ADDR_LEN; ++j) {
printf("%02X", netifs[i].macaddr[j]);
if (j < MAC_ADDR_LEN - 1) {
printf(":");
}
}
std::cout << std::endl;
std::cout << "Real Interface Name: " << netifs[i].ifreal << std::endl;
std::cout << "---------------------------------" << std::endl;
}
return 0;
}
如下为命令操作:
查看虚IP
ip -f inet addr
删除指定虚IP
ip addr del 172.x.x.x dev ens33
新增虚IP:
ifconfig ens33:1 172.x.x.x netmask 255.255.250.0
以上注意需要加:1这些来新增一个设备,添加完后在ifconfig 能看到新加的IP。
如下的命令给加到同一个设备上,导致ifconfig看不到,ip a下看得到:文章来源:https://www.toymoban.com/news/detail-830598.html
ip addr add 192.168.0.102/24 dev eth0文章来源地址https://www.toymoban.com/news/detail-830598.html
到了这里,关于linux的IP及虚IP(附加IP)获取打印的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!