/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, OCaml, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
#include <iostream>
#include <vector>
#include <cstring>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
struct AliasString {
std::string str;
AliasString(const std::string& s) : str(s) {}
};
struct NetworkAdapterInfo {
struct IpAddrString {
typedef std::vector<IpAddrString> List;
AliasString ip;
explicit IpAddrString(const AliasString& ip_) : ip(ip_) {}
};
AliasString adapterName;
AliasString description;
AliasString adapterUserName;
std::vector<unsigned char> physicalAddress;
IpAddrString::List ipList;
explicit NetworkAdapterInfo(const AliasString& adapterName_,
const AliasString& description_,
const AliasString& adapterUserName_,
IpAddrString::List const& ipList_,
std::vector<unsigned char> const& physicalAddress_) :
adapterName(adapterName_),
description(description_),
adapterUserName(adapterUserName_),
ipList(ipList_),
physicalAddress(physicalAddress_) {}
};
void getAdaptersInfo(std::vector<NetworkAdapterInfo>& adapterList) {
struct ifaddrs* ifAddrStruct = nullptr;
struct ifaddrs* ifa = nullptr;
if (getifaddrs(&ifAddrStruct) == -1) {
perror("getifaddrs");
return;
}
for (ifa = ifAddrStruct; ifa != nullptr; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == nullptr || ifa->ifa_addr->sa_family != AF_INET) {
continue; // Skip non-IPv4 addresses
}
// Get the adapter name
AliasString adapterName(ifa->ifa_name);
AliasString description("N/A"); // Description is not directly available in Linux
AliasString userName("N/A"); // User name is not directly available in Linux
// Get the IP address
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr, addressBuffer, sizeof(addressBuffer));
NetworkAdapterInfo::IpAddrString::List ipList;
ipList.push_back(NetworkAdapterInfo::IpAddrString(AliasString(addressBuffer)));
// Get the MAC address
std::vector<unsigned char> physicalAddress;
if (ifa->ifa_addr->sa_family == AF_PACKET) {
physicalAddress.assign(ifa->ifa_addr->sa_data, ifa->ifa_addr->sa_data + 10);
}
adapterList.push_back(NetworkAdapterInfo(adapterName, description, userName, ipList, physicalAddress));
}
freeifaddrs(ifAddrStruct);
}
int main() {
std::vector<NetworkAdapterInfo> adapterList;
getAdaptersInfo(adapterList);
// Output the adapter information
for (const auto& adapter : adapterList) {
std::cout << "Adapter Name: " << adapter.adapterName.str << std::endl;
std::cout << "Description: " << adapter.description.str << std::endl;
std::cout << "User Name: " << adapter.adapterUserName.str << std::endl;
std::cout << "IP Addresses: ";
for (const auto& ip : adapter.ipList) {
std::cout << ip.ip.str << " ";
}
std::cout << std::endl;
std::cout << "Physical Address: ";
for (const auto& byte : adapter.physicalAddress) {
std::cout << std::hex << (int)byte << ":";
}
std::cout << std::dec << std::endl << std::endl;
}
return 0;
}