39
39
#include "Poco/Net/NetException.h"
40
40
#include "Poco/NumberFormatter.h"
41
41
#include "Poco/RefCountedObject.h"
42
#if defined(_WIN32) && defined(POCO_WIN32_UTF8)
43
#include "Poco/UnicodeConverter.h"
61
64
NetworkInterfaceImpl();
62
NetworkInterfaceImpl(const std::string& name, const IPAddress& address, int index = -1);
63
NetworkInterfaceImpl(const std::string& name, const IPAddress& address, const IPAddress& subnetMask, const IPAddress& broadcastAddress, int index = -1);
65
NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const IPAddress& address, int index = -1);
66
NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const IPAddress& address, const IPAddress& subnetMask, const IPAddress& broadcastAddress, int index = -1);
66
69
const std::string& name() const;
70
const std::string& displayName() const;
67
71
const IPAddress& address() const;
68
72
const IPAddress& subnetMask() const;
69
73
const IPAddress& broadcastAddress() const;
89
NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const IPAddress& address, int index):
94
NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const IPAddress& address, int index):
96
_displayName(displayName),
121
NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const IPAddress& address, const IPAddress& subnetMask, const IPAddress& broadcastAddress, int index):
127
NetworkInterfaceImpl::NetworkInterfaceImpl(const std::string& name, const std::string& displayName, const IPAddress& address, const IPAddress& subnetMask, const IPAddress& broadcastAddress, int index):
129
_displayName(displayName),
123
130
_address(address),
124
131
_subnetMask(subnetMask),
125
132
_broadcastAddress(broadcastAddress),
200
NetworkInterface::NetworkInterface(const std::string& name, const std::string& displayName, const IPAddress& address, int index):
201
_pImpl(new NetworkInterfaceImpl(name, displayName, address, index))
206
NetworkInterface::NetworkInterface(const std::string& name, const std::string& displayName, const IPAddress& address, const IPAddress& subnetMask, const IPAddress& broadcastAddress, int index):
207
_pImpl(new NetworkInterfaceImpl(name, displayName, address, subnetMask, broadcastAddress, index))
187
212
NetworkInterface::NetworkInterface(const std::string& name, const IPAddress& address, int index):
188
_pImpl(new NetworkInterfaceImpl(name, address, index))
213
_pImpl(new NetworkInterfaceImpl(name, name, address, index))
193
218
NetworkInterface::NetworkInterface(const std::string& name, const IPAddress& address, const IPAddress& subnetMask, const IPAddress& broadcastAddress, int index):
194
_pImpl(new NetworkInterfaceImpl(name, address, subnetMask, broadcastAddress, index))
219
_pImpl(new NetworkInterfaceImpl(name, name, address, subnetMask, broadcastAddress, index))
292
323
throw InterfaceNotFoundException(addr.toString(), "interface has no IP address");
295
return NetworkInterface(name, addr, index);
326
return NetworkInterface(name, name, addr, index);
378
409
if (pAddress->FirstUnicastAddress)
380
411
IPAddress addr(pAddress->FirstUnicastAddress->Address.lpSockaddr, pAddress->FirstUnicastAddress->Address.iSockaddrLength);
381
result.push_back(NetworkInterface(std::string(pAddress->AdapterName), addr, pAddress->Ipv6IfIndex));
412
std::string name(pAddress->AdapterName);
413
std::string displayName;
414
#ifdef POCO_WIN32_UTF8
415
Poco::UnicodeConverter::toUTF8(pAddress->Description, displayName);
417
char displayNameBuffer[1024];
418
int rc = WideCharToMultiByte(CP_ACP, WC_DEFAULTCHAR, pAddress->Description, -1, displayNameBuffer, sizeof(displayNameBuffer), NULL, NULL);
419
if (rc) displayName = displayNameBuffer;
421
result.push_back(NetworkInterface(name, displayName, addr, pAddress->Ipv6IfIndex));
382
422
pAddress = pAddress->Next;
396
436
// Add IPv4 loopback interface (not returned by GetAdaptersInfo)
397
result.push_back(NetworkInterface("Loopback", IPAddress("127.0.0.1"), IPAddress("255.0.0.0"), IPAddress(), -1));
437
result.push_back(NetworkInterface("Loopback", "Loopback Interface", IPAddress("127.0.0.1"), IPAddress("255.0.0.0"), IPAddress(), -1));
398
438
// On Windows 2000 we use GetAdaptersInfo.
399
439
PIP_ADAPTER_INFO pAdapterInfo;
400
440
PIP_ADAPTER_INFO pInfo = 0;
425
465
IPAddress subnetMask(std::string(pInfo->IpAddressList.IpMask.String));
426
466
IPAddress broadcastAddress(address);
427
467
broadcastAddress.mask(subnetMask, IPAddress("255.255.255.255"));
428
result.push_back(NetworkInterface(std::string(pInfo->AdapterName), address, subnetMask, broadcastAddress));
468
std::string name(pInfo->AdapterName);
469
std::string displayName(pInfo->Description);
470
result.push_back(NetworkInterface(name, displayName, address, subnetMask, broadcastAddress));
430
472
pInfo = pInfo->Next;
476
518
if (ifap->ifa_addr->sa_family == AF_INET)
520
std::string name(ifap->ifa_name);
478
521
IPAddress addr(&reinterpret_cast<struct sockaddr_in*>(ifap->ifa_addr)->sin_addr, sizeof(struct in_addr));
479
result.push_back(NetworkInterface(std::string(ifap->ifa_name), addr));
522
IPAddress subnetMask(&reinterpret_cast<struct sockaddr_in*>(ifap->ifa_netmask)->sin_addr, sizeof(struct in_addr));
523
IPAddress broadcastAddr;
524
if (ifap->ifa_flags & IFF_BROADCAST)
525
broadcastAddr = IPAddress(&reinterpret_cast<struct sockaddr_in*>(ifap->ifa_dstaddr)->sin_addr, sizeof(struct in_addr));
526
result.push_back(NetworkInterface(name, name, addr, subnetMask, broadcastAddr));
481
528
#if defined(POCO_HAVE_IPv6)
482
529
else if (ifap->ifa_addr->sa_family == AF_INET6)
484
531
IPAddress addr(&reinterpret_cast<struct sockaddr_in6*>(ifap->ifa_addr)->sin6_addr, sizeof(struct in6_addr));
485
result.push_back(NetworkInterface(std::string(ifap->ifa_name), addr, if_nametoindex(ifap->ifa_name)));
532
std::string name(ifap->ifa_name);
533
result.push_back(NetworkInterface(name, name, addr, if_nametoindex(ifap->ifa_name)));
567
result.push_back(NetworkInterface(std::string(ifr->ifr_name), addr, index));
615
std::string name(ifr->ifr_name);
616
result.push_back(NetworkInterface(name, name, addr, index));
569
618
ptr += sizeof(struct ifreq);
662
result.push_back(NetworkInterface(std::string(ifr->ifr_name), addr, index));
711
std::string name(ifr->ifr_name);
712
result.push_back(NetworkInterface(name, name, addr, index));
664
714
len += sizeof(ifr->ifr_name);