代码为:
#include <arpa/inet.h>
#include <cerrno>
#include <ifaddrs.h>
#include <iostream>
#include <net/if.h>
#include <string>
#include <string.h>
#include <sysexits.h>
#include <sys/socket.h>
#include <sys/types.h>
int main(void)
{
struct ifaddrs* ptr_ifaddrs;
int result = getifaddrs(&ptr_ifaddrs);
if( result != 0 ){
std::cout << "`getifaddrs()` failed: " << strerror(errno) << std::endl;
return EX_OSERR;
}
for(
struct ifaddrs* ptr_entry = ptr_ifaddrs;
ptr_entry != NULL;
ptr_entry = ptr_entry->ifa_next
){
std::string ipaddress_human_readable_form;
std::string netmask_human_readable_form;
std::string interface_name = std::string(ptr_entry->ifa_name);
sa_family_t address_family = ptr_entry->ifa_addr->sa_family;
// IPv4
// Be aware that the `ifa_addr`, `ifa_netmask` and `ifa_data` fields might contain nullptr.
// Dereferencing nullptr causes "Undefined behavior" problems.
// So it is need to check these fields before dereferencing.
if( ptr_entry->ifa_addr != NULL ){
char buffer[INET_ADDRSTRLEN] = {0, };
inet_ntop(
address_family,
&((struct sockaddr_in*)(ptr_entry->ifa_addr))->sin_addr,
buffer,
INET_ADDRSTRLEN
);
ipaddress_human_readable_form = std::string(buffer);
}
if( ptr_entry->ifa_netmask != NULL ){
char buffer[INET_ADDRSTRLEN] = {0, };
inet_ntop(
address_family,
&((struct sockaddr_in*)(ptr_entry->ifa_netmask))->sin_addr,
buffer,
INET_ADDRSTRLEN
);
netmask_human_readable_form = std::string(buffer);
}
if (interface_name == "ens33" && ipaddress_human_readable_form != ""){
std::cout << interface_name << ": IP address = " << ipaddress_human_readable_form << ", netmask = " << netmask_human_readable_form << std::endl;
}
}
freeifaddrs(ptr_ifaddrs);
return EX_OK;
}
open ubuntu command line and enter:
g++ -Wall -g test_niclist.cpp -o niclist
./niclist
GET ip function(useful)
上面的链接,需要c++ 20,如果没有下载,就要把nullptr改成NULL