Untitled
unknown
plain_text
3 years ago
2.3 kB
7
Indexable
#include <iostream>
#include <string>
#include <vector>
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdexcept>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
std::string get_ip_address_from_mac(const std::string& mac_address) {
// Allocate memory for the IP net table
DWORD buffer_size = 0;
PMIB_IPNETTABLE ip_net_table = nullptr;
// Retrieve the required buffer size
DWORD result = GetIpNetTable(ip_net_table, &buffer_size, FALSE);
if (result != ERROR_INSUFFICIENT_BUFFER) {
throw std::runtime_error("Failed to get buffer size for IP net table.");
}
// Allocate the memory and retrieve the IP net table
ip_net_table = reinterpret_cast<PMIB_IPNETTABLE>(new char[buffer_size]);
result = GetIpNetTable(ip_net_table, &buffer_size, FALSE);
if (result != NO_ERROR) {
delete[] ip_net_table;
throw std::runtime_error("Failed to get IP net table: " + std::to_string(result));
}
// Search for the MAC address in the IP net table
std::string ip_address;
for (DWORD i = 0; i < ip_net_table->dwNumEntries; i++) {
MIB_IPNETROW& row = ip_net_table->table[i];
char mac_buffer[18];
snprintf(mac_buffer, sizeof(mac_buffer), "%02X-%02X-%02X-%02X-%02X-%02X",
row.bPhysAddr[0], row.bPhysAddr[1],
row.bPhysAddr[2], row.bPhysAddr[3],
row.bPhysAddr[4], row.bPhysAddr[5]);
if (mac_address == mac_buffer) {
char ip_buffer[INET_ADDRSTRLEN];
InetNtop(AF_INET, &row.dwAddr, ip_buffer, INET_ADDRSTRLEN);
ip_address = ip_buffer;
break;
}
}
delete[] ip_net_table;
if (ip_address.empty()) {
throw std::runtime_error("IP address not found for MAC address: " + mac_address);
}
return ip_address;
}
int main() {
try {
std::string mac_address = "AA-BB-CC-DD-EE-FF"; // Replace with the MAC address you want to look up
std::string ip_address = get_ip_address_from_mac(mac_address);
std::cout << "IP address for MAC " << mac_address << ": " << ip_address << std::endl;
} catch (const std::runtime_error& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
Editor is loading...