mirror of
https://github.com/pocoproject/poco.git
synced 2025-01-29 12:45:22 +01:00
First stab (Windows) at IPAddress SOO
This commit is contained in:
parent
9619dfbe7b
commit
47af51fdfb
@ -270,6 +270,7 @@
|
||||
<ClInclude Include="include\Poco\Net\DNS.h" />
|
||||
<ClInclude Include="include\Poco\Net\HostEntry.h" />
|
||||
<ClInclude Include="include\Poco\Net\IPAddress.h" />
|
||||
<ClInclude Include="include\Poco\Net\IPAddressImpl.h" />
|
||||
<ClInclude Include="include\Poco\Net\Net.h" />
|
||||
<ClInclude Include="include\Poco\Net\NetException.h" />
|
||||
<ClInclude Include="include\Poco\Net\NetworkInterface.h" />
|
||||
@ -369,6 +370,7 @@
|
||||
<ClCompile Include="src\DNS.cpp" />
|
||||
<ClCompile Include="src\HostEntry.cpp" />
|
||||
<ClCompile Include="src\IPAddress.cpp" />
|
||||
<ClCompile Include="src\IPAddressImpl.cpp" />
|
||||
<ClCompile Include="src\Net.cpp" />
|
||||
<ClCompile Include="src\NetException.cpp" />
|
||||
<ClCompile Include="src\NetworkInterface.cpp" />
|
||||
|
@ -420,6 +420,9 @@
|
||||
<ClInclude Include="include\Poco\Net\ParallelSocketReactor.h">
|
||||
<Filter>Reactor\Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="include\Poco\Net\IPAddressImpl.h">
|
||||
<Filter>NetCore\Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\DNS.cpp">
|
||||
@ -695,6 +698,9 @@
|
||||
<ClCompile Include="src\Net.cpp">
|
||||
<Filter>NetCore\Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\IPAddressImpl.cpp">
|
||||
<Filter>NetCore\Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="..\DLLVersion.rc" />
|
||||
|
@ -42,6 +42,7 @@
|
||||
|
||||
#include "Poco/Net/Net.h"
|
||||
#include "Poco/Net/SocketDefs.h"
|
||||
#include "Poco/Net/IPAddressImpl.h"
|
||||
#include <vector>
|
||||
|
||||
|
||||
@ -53,9 +54,6 @@ class BinaryWriter;
|
||||
namespace Net {
|
||||
|
||||
|
||||
class IPAddressImpl;
|
||||
|
||||
|
||||
class Net_API IPAddress
|
||||
/// This class represents an internet (IP) host
|
||||
/// address. The address can belong either to the
|
||||
@ -80,9 +78,9 @@ public:
|
||||
enum Family
|
||||
/// Possible address families for IP addresses.
|
||||
{
|
||||
IPv4
|
||||
IPv4 = Poco::Net::Impl::IPAddressImpl::IPv4
|
||||
#ifdef POCO_HAVE_IPv6
|
||||
,IPv6
|
||||
,IPv6 = Poco::Net::Impl::IPAddressImpl::IPv6
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -143,7 +141,7 @@ public:
|
||||
IPAddress& operator = (const IPAddress& addr);
|
||||
/// Assigns an IPAddress.
|
||||
|
||||
void swap(IPAddress& address);
|
||||
//void swap(IPAddress& address);
|
||||
/// Swaps the IPAddress with another one.
|
||||
|
||||
Family family() const;
|
||||
@ -387,26 +385,26 @@ public:
|
||||
/// Maximum length in bytes of a socket address.
|
||||
};
|
||||
|
||||
protected:
|
||||
void init(IPAddressImpl* pImpl);
|
||||
|
||||
private:
|
||||
IPAddressImpl* _pImpl;
|
||||
typedef Poco::Net::Impl::IPAddressImpl Impl;
|
||||
typedef Impl* Ptr;
|
||||
|
||||
Ptr pImpl() const;
|
||||
|
||||
char _memory[sizeof(Poco::Net::Impl::IPv6AddressImpl)];
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// inlines
|
||||
//
|
||||
inline void swap(IPAddress& addr1, IPAddress& addr2)
|
||||
inline IPAddress::Ptr IPAddress::pImpl() const
|
||||
{
|
||||
addr1.swap(addr2);
|
||||
return reinterpret_cast<Ptr>(const_cast<char *>(_memory));
|
||||
}
|
||||
|
||||
|
||||
BinaryWriter& operator << (BinaryWriter& writer, const IPAddress& value);
|
||||
BinaryReader& operator >> (BinaryReader& reader, IPAddress& value);
|
||||
|
||||
|
||||
} } // namespace Poco::Net
|
||||
|
||||
|
||||
|
201
Net/include/Poco/Net/IPAddressImpl.h
Normal file
201
Net/include/Poco/Net/IPAddressImpl.h
Normal file
@ -0,0 +1,201 @@
|
||||
//
|
||||
// IPAddressImpl.h
|
||||
//
|
||||
// $Id: //poco/1.4/Net/include/Poco/Net/IPAddressImpl.h#2 $
|
||||
//
|
||||
// Library: Net
|
||||
// Package: NetCore
|
||||
// Module: IPAddressImpl
|
||||
//
|
||||
// Definition of the IPAddressImpl class.
|
||||
//
|
||||
// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#ifndef Net_IPAddressImpl_INCLUDED
|
||||
#define Net_IPAddressImpl_INCLUDED
|
||||
|
||||
|
||||
#include "Poco/Net/Net.h"
|
||||
#include "Poco/Net/SocketDefs.h"
|
||||
#include <vector>
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Net {
|
||||
namespace Impl {
|
||||
|
||||
|
||||
class IPAddressImpl
|
||||
{
|
||||
public:
|
||||
enum Family
|
||||
/// Possible address families for IP addresses.
|
||||
{
|
||||
IPv4
|
||||
#ifdef POCO_HAVE_IPv6
|
||||
,IPv6
|
||||
#endif
|
||||
};
|
||||
|
||||
virtual std::string toString() const = 0;
|
||||
virtual poco_socklen_t length() const = 0;
|
||||
virtual const void* addr() const = 0;
|
||||
virtual Family family() const = 0;
|
||||
virtual int af() const = 0;
|
||||
virtual Poco::UInt32 scope() const = 0;
|
||||
virtual bool isWildcard() const = 0;
|
||||
virtual bool isBroadcast() const = 0;
|
||||
virtual bool isLoopback() const = 0;
|
||||
virtual bool isMulticast() const = 0;
|
||||
virtual bool isLinkLocal() const = 0;
|
||||
virtual bool isSiteLocal() const = 0;
|
||||
virtual bool isIPv4Mapped() const = 0;
|
||||
virtual bool isIPv4Compatible() const = 0;
|
||||
virtual bool isWellKnownMC() const = 0;
|
||||
virtual bool isNodeLocalMC() const = 0;
|
||||
virtual bool isLinkLocalMC() const = 0;
|
||||
virtual bool isSiteLocalMC() const = 0;
|
||||
virtual bool isOrgLocalMC() const = 0;
|
||||
virtual bool isGlobalMC() const = 0;
|
||||
virtual void mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet) = 0;
|
||||
virtual unsigned prefixLength() const = 0;
|
||||
|
||||
virtual IPAddressImpl* clone() const = 0;
|
||||
|
||||
protected:
|
||||
IPAddressImpl();
|
||||
virtual ~IPAddressImpl();
|
||||
|
||||
private:
|
||||
IPAddressImpl(const IPAddressImpl&);
|
||||
IPAddressImpl& operator = (const IPAddressImpl&);
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// IPv4AddressImpl
|
||||
//
|
||||
|
||||
class IPv4AddressImpl: public IPAddressImpl
|
||||
{
|
||||
public:
|
||||
IPv4AddressImpl();
|
||||
IPv4AddressImpl(const void* addr);
|
||||
IPv4AddressImpl(unsigned prefix);
|
||||
IPv4AddressImpl(const IPv4AddressImpl& addr);
|
||||
IPv4AddressImpl& operator = (const IPv4AddressImpl&);
|
||||
std::string toString() const;
|
||||
poco_socklen_t length() const;
|
||||
const void* addr() const;
|
||||
Family family() const;
|
||||
int af() const;
|
||||
unsigned prefixLength() const;
|
||||
Poco::UInt32 scope() const;
|
||||
bool isWildcard() const;
|
||||
bool isBroadcast() const;
|
||||
bool isLoopback() const;
|
||||
bool isMulticast() const;
|
||||
bool isLinkLocal() const;
|
||||
bool isSiteLocal() const;
|
||||
bool isIPv4Compatible() const;
|
||||
bool isIPv4Mapped() const;
|
||||
bool isWellKnownMC() const;
|
||||
bool isNodeLocalMC() const;
|
||||
bool isLinkLocalMC() const;
|
||||
bool isSiteLocalMC() const;
|
||||
bool isOrgLocalMC() const;
|
||||
bool isGlobalMC() const;
|
||||
static IPv4AddressImpl parse(const std::string& addr);
|
||||
void mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet);
|
||||
IPAddressImpl* clone() const;
|
||||
IPv4AddressImpl operator & (const IPv4AddressImpl& addr) const;
|
||||
IPv4AddressImpl operator | (const IPv4AddressImpl& addr) const;
|
||||
IPv4AddressImpl operator ^ (const IPv4AddressImpl& addr) const;
|
||||
IPv4AddressImpl operator ~ () const;
|
||||
bool operator == (const IPv4AddressImpl& addr) const;
|
||||
bool operator != (const IPv4AddressImpl& addr) const;
|
||||
|
||||
private:
|
||||
struct in_addr _addr;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// IPv6AddressImpl
|
||||
//
|
||||
|
||||
class IPv6AddressImpl: public IPAddressImpl
|
||||
{
|
||||
public:
|
||||
IPv6AddressImpl();
|
||||
IPv6AddressImpl(const void* addr);
|
||||
IPv6AddressImpl(const void* addr, Poco::UInt32 scope);
|
||||
IPv6AddressImpl(unsigned prefix);
|
||||
std::string toString() const;
|
||||
poco_socklen_t length() const;
|
||||
const void* addr() const;
|
||||
Family family() const;
|
||||
int af() const;
|
||||
unsigned prefixLength() const;
|
||||
Poco::UInt32 scope() const;
|
||||
bool isWildcard() const;
|
||||
bool isBroadcast() const;
|
||||
bool isLoopback() const;
|
||||
bool isMulticast() const;
|
||||
bool isLinkLocal() const;
|
||||
bool isSiteLocal() const;
|
||||
bool isIPv4Compatible() const;
|
||||
bool isIPv4Mapped() const;
|
||||
bool isWellKnownMC() const;
|
||||
bool isNodeLocalMC() const;
|
||||
bool isLinkLocalMC() const;
|
||||
bool isSiteLocalMC() const;
|
||||
bool isOrgLocalMC() const;
|
||||
bool isGlobalMC() const;
|
||||
static IPv6AddressImpl parse(const std::string& addr);
|
||||
void mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet);
|
||||
IPAddressImpl* clone() const;
|
||||
IPv6AddressImpl operator & (const IPv6AddressImpl& addr) const;
|
||||
IPv6AddressImpl operator | (const IPv6AddressImpl& addr) const;
|
||||
IPv6AddressImpl operator ^ (const IPv6AddressImpl& addr) const;
|
||||
IPv6AddressImpl operator ~ () const;
|
||||
bool operator == (const IPv6AddressImpl& addr) const;
|
||||
bool operator != (const IPv6AddressImpl& addr) const;
|
||||
IPv6AddressImpl(const IPv6AddressImpl& addr);
|
||||
IPv6AddressImpl& operator = (const IPv6AddressImpl&);
|
||||
|
||||
private:
|
||||
struct in6_addr _addr;
|
||||
unsigned int _scope;
|
||||
};
|
||||
|
||||
|
||||
} } } // namespace Poco::Net::Impl
|
||||
|
||||
|
||||
#endif // Net_IPAddressImpl_INCLUDED
|
File diff suppressed because it is too large
Load Diff
770
Net/src/IPAddressImpl.cpp
Normal file
770
Net/src/IPAddressImpl.cpp
Normal file
@ -0,0 +1,770 @@
|
||||
//
|
||||
// IPAddress.cpp
|
||||
//
|
||||
// $Id: //poco/1.4/Net/src/IPAddress.cpp#5 $
|
||||
//
|
||||
// Library: Net
|
||||
// Package: NetCore
|
||||
// Module: IPAddress
|
||||
//
|
||||
// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
|
||||
// and Contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person or organization
|
||||
// obtaining a copy of the software and accompanying documentation covered by
|
||||
// this license (the "Software") to use, reproduce, display, distribute,
|
||||
// execute, and transmit the Software, and to prepare derivative works of the
|
||||
// Software, and to permit third-parties to whom the Software is furnished to
|
||||
// do so, all subject to the following:
|
||||
//
|
||||
// The copyright notices in the Software and this entire statement, including
|
||||
// the above license grant, this restriction and the following disclaimer,
|
||||
// must be included in all copies of the Software, in whole or in part, and
|
||||
// all derivative works of the Software, unless such copies or derivative
|
||||
// works are solely in the form of machine-executable object code generated by
|
||||
// a source language processor.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
|
||||
|
||||
#include "Poco/Net/IPAddressImpl.h"
|
||||
#include "Poco/Net/NetException.h"
|
||||
#include "Poco/RefCountedObject.h"
|
||||
#include "Poco/NumberFormatter.h"
|
||||
#include "Poco/String.h"
|
||||
#include "Poco/Types.h"
|
||||
|
||||
|
||||
using Poco::RefCountedObject;
|
||||
using Poco::NumberFormatter;
|
||||
using Poco::toLower;
|
||||
using Poco::UInt8;
|
||||
using Poco::UInt16;
|
||||
using Poco::UInt32;
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
template <typename T>
|
||||
unsigned maskBits(T val, unsigned size)
|
||||
/// Returns the length of the mask (number of bits set in val).
|
||||
/// The val should be either all zeros or two contiguos areas of 1s and 0s.
|
||||
/// The algorithm ignores invalid non-contiguous series of 1s and treats val
|
||||
/// as if all bits between MSb and last non-zero bit are set to 1.
|
||||
{
|
||||
unsigned count = 0;
|
||||
if (val)
|
||||
{
|
||||
val = (val ^ (val - 1)) >> 1;
|
||||
for (count = 0; val; ++count) val >>= 1;
|
||||
}
|
||||
else count = size;
|
||||
return size - count;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
namespace Poco {
|
||||
namespace Net {
|
||||
namespace Impl {
|
||||
|
||||
//
|
||||
// IPAddressImpl
|
||||
//
|
||||
|
||||
|
||||
IPAddressImpl::IPAddressImpl()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
IPAddressImpl::~IPAddressImpl()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// IPv4AddressImpl
|
||||
//
|
||||
|
||||
IPv4AddressImpl::IPv4AddressImpl()
|
||||
{
|
||||
std::memset(&_addr, 0, sizeof(_addr));
|
||||
}
|
||||
|
||||
|
||||
IPv4AddressImpl::IPv4AddressImpl(const void* addr)
|
||||
{
|
||||
std::memcpy(&_addr, addr, sizeof(_addr));
|
||||
}
|
||||
|
||||
|
||||
IPv4AddressImpl::IPv4AddressImpl(unsigned prefix)
|
||||
{
|
||||
UInt32 addr = (prefix == 32) ? 0xffffffff : ~(0xffffffff >> prefix);
|
||||
_addr.s_addr = htonl(addr);
|
||||
}
|
||||
|
||||
|
||||
IPv4AddressImpl::IPv4AddressImpl(const IPv4AddressImpl& addr)
|
||||
{
|
||||
std::memcpy(&_addr, &addr._addr, sizeof(_addr));
|
||||
}
|
||||
|
||||
|
||||
IPv4AddressImpl& IPv4AddressImpl::operator = (const IPv4AddressImpl& addr)
|
||||
{
|
||||
std::memcpy(&_addr, &addr._addr, sizeof(_addr));
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
std::string IPv4AddressImpl::toString() const
|
||||
{
|
||||
const UInt8* bytes = reinterpret_cast<const UInt8*>(&_addr);
|
||||
std::string result;
|
||||
result.reserve(16);
|
||||
NumberFormatter::append(result, bytes[0]);
|
||||
result.append(".");
|
||||
NumberFormatter::append(result, bytes[1]);
|
||||
result.append(".");
|
||||
NumberFormatter::append(result, bytes[2]);
|
||||
result.append(".");
|
||||
NumberFormatter::append(result, bytes[3]);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
poco_socklen_t IPv4AddressImpl::length() const
|
||||
{
|
||||
return sizeof(_addr);
|
||||
}
|
||||
|
||||
|
||||
const void* IPv4AddressImpl::addr() const
|
||||
{
|
||||
return &_addr;
|
||||
}
|
||||
|
||||
|
||||
IPAddressImpl::Family IPv4AddressImpl::family() const
|
||||
{
|
||||
return IPAddressImpl::IPv4;
|
||||
}
|
||||
|
||||
|
||||
int IPv4AddressImpl::af() const
|
||||
{
|
||||
return AF_INET;
|
||||
}
|
||||
|
||||
|
||||
unsigned IPv4AddressImpl::prefixLength() const
|
||||
{
|
||||
return maskBits(ntohl(_addr.s_addr), 32);
|
||||
}
|
||||
|
||||
|
||||
Poco::UInt32 IPv4AddressImpl::scope() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isWildcard() const
|
||||
{
|
||||
return _addr.s_addr == INADDR_ANY;
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isBroadcast() const
|
||||
{
|
||||
return _addr.s_addr == INADDR_NONE;
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isLoopback() const
|
||||
{
|
||||
return (ntohl(_addr.s_addr) & 0xFF000000) == 0x7F000000; // 127.0.0.1 to 127.255.255.255
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isMulticast() const
|
||||
{
|
||||
return (ntohl(_addr.s_addr) & 0xF0000000) == 0xE0000000; // 224.0.0.0/24 to 239.0.0.0/24
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isLinkLocal() const
|
||||
{
|
||||
return (ntohl(_addr.s_addr) & 0xFFFF0000) == 0xA9FE0000; // 169.254.0.0/16
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isSiteLocal() const
|
||||
{
|
||||
UInt32 addr = ntohl(_addr.s_addr);
|
||||
return (addr & 0xFF000000) == 0x0A000000 || // 10.0.0.0/24
|
||||
(addr & 0xFFFF0000) == 0xC0A80000 || // 192.68.0.0/16
|
||||
(addr >= 0xAC100000 && addr <= 0xAC1FFFFF); // 172.16.0.0 to 172.31.255.255
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isIPv4Compatible() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isIPv4Mapped() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isWellKnownMC() const
|
||||
{
|
||||
return (ntohl(_addr.s_addr) & 0xFFFFFF00) == 0xE0000000; // 224.0.0.0/8
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isNodeLocalMC() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isLinkLocalMC() const
|
||||
{
|
||||
return (ntohl(_addr.s_addr) & 0xFF000000) == 0xE0000000; // 244.0.0.0/24
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isSiteLocalMC() const
|
||||
{
|
||||
return (ntohl(_addr.s_addr) & 0xFFFF0000) == 0xEFFF0000; // 239.255.0.0/16
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isOrgLocalMC() const
|
||||
{
|
||||
return (ntohl(_addr.s_addr) & 0xFFFF0000) == 0xEFC00000; // 239.192.0.0/16
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::isGlobalMC() const
|
||||
{
|
||||
UInt32 addr = ntohl(_addr.s_addr);
|
||||
return addr >= 0xE0000100 && addr <= 0xEE000000; // 224.0.1.0 to 238.255.255.255
|
||||
}
|
||||
|
||||
|
||||
IPv4AddressImpl IPv4AddressImpl::parse(const std::string& addr)
|
||||
{
|
||||
if (addr.empty()) return IPv4AddressImpl();
|
||||
#if defined(_WIN32)
|
||||
struct in_addr ia;
|
||||
ia.s_addr = inet_addr(addr.c_str());
|
||||
if (ia.s_addr == INADDR_NONE && addr != "255.255.255.255")
|
||||
return IPv4AddressImpl();
|
||||
else
|
||||
return IPv4AddressImpl(&ia);
|
||||
#else
|
||||
#if __GNUC__ < 3 || defined(POCO_VXWORKS)
|
||||
struct in_addr ia;
|
||||
ia.s_addr = inet_addr(const_cast<char*>(addr.c_str()));
|
||||
if (ia.s_addr == INADDR_NONE && addr != "255.255.255.255")
|
||||
return IPv4AddressImpl();
|
||||
else
|
||||
return IPv4AddressImpl(&ia);
|
||||
#else
|
||||
struct in_addr ia;
|
||||
if (inet_aton(addr.c_str(), &ia))
|
||||
return IPv4AddressImpl(&ia);
|
||||
else
|
||||
return IPv4AddressImpl();
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void IPv4AddressImpl::mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet)
|
||||
{
|
||||
poco_assert (pMask->af() == AF_INET && pSet->af() == AF_INET);
|
||||
|
||||
_addr.s_addr &= static_cast<const IPv4AddressImpl*>(pMask)->_addr.s_addr;
|
||||
_addr.s_addr |= static_cast<const IPv4AddressImpl*>(pSet)->_addr.s_addr & ~static_cast<const IPv4AddressImpl*>(pMask)->_addr.s_addr;
|
||||
}
|
||||
|
||||
|
||||
IPAddressImpl* IPv4AddressImpl::clone() const
|
||||
{
|
||||
return new IPv4AddressImpl(&_addr);
|
||||
}
|
||||
|
||||
|
||||
IPv4AddressImpl IPv4AddressImpl::operator & (const IPv4AddressImpl& addr) const
|
||||
{
|
||||
IPv4AddressImpl result(&_addr);
|
||||
result._addr.s_addr &= addr._addr.s_addr;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
IPv4AddressImpl IPv4AddressImpl::operator | (const IPv4AddressImpl& addr) const
|
||||
{
|
||||
IPv4AddressImpl result(&_addr);
|
||||
result._addr.s_addr |= addr._addr.s_addr;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
IPv4AddressImpl IPv4AddressImpl::operator ^ (const IPv4AddressImpl& addr) const
|
||||
{
|
||||
IPv4AddressImpl result(&_addr);
|
||||
result._addr.s_addr ^= addr._addr.s_addr;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
IPv4AddressImpl IPv4AddressImpl::operator ~ () const
|
||||
{
|
||||
IPv4AddressImpl result(&_addr);
|
||||
result._addr.s_addr ^= 0xffffffff;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::operator == (const IPv4AddressImpl& addr) const
|
||||
{
|
||||
return 0 == std::memcmp(&addr._addr, &_addr, sizeof(_addr));
|
||||
}
|
||||
|
||||
|
||||
bool IPv4AddressImpl::operator != (const IPv4AddressImpl& addr) const
|
||||
{
|
||||
return !(*this == addr);
|
||||
}
|
||||
|
||||
|
||||
#if defined(POCO_HAVE_IPv6)
|
||||
|
||||
|
||||
//
|
||||
// IPv6AddressImpl
|
||||
//
|
||||
|
||||
|
||||
IPv6AddressImpl::IPv6AddressImpl(): _scope(0)
|
||||
{
|
||||
std::memset(&_addr, 0, sizeof(_addr));
|
||||
}
|
||||
|
||||
IPv6AddressImpl::IPv6AddressImpl(const void* addr): _scope(0)
|
||||
{
|
||||
std::memcpy(&_addr, addr, sizeof(_addr));
|
||||
}
|
||||
|
||||
IPv6AddressImpl::IPv6AddressImpl(const void* addr, Poco::UInt32 scope): _scope(scope)
|
||||
{
|
||||
std::memcpy(&_addr, addr, sizeof(_addr));
|
||||
}
|
||||
|
||||
|
||||
IPv6AddressImpl::IPv6AddressImpl(const IPv6AddressImpl& addr): _scope(addr._scope)
|
||||
{
|
||||
std::memcpy((void*) &_addr, (void*) &addr._addr, sizeof(_addr));
|
||||
}
|
||||
|
||||
|
||||
IPv6AddressImpl& IPv6AddressImpl::operator = (const IPv6AddressImpl& addr)
|
||||
{
|
||||
_scope = addr._scope;
|
||||
std::memcpy(&_addr, &addr._addr, sizeof(_addr));
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
IPv6AddressImpl::IPv6AddressImpl(unsigned prefix):
|
||||
_scope(0)
|
||||
{
|
||||
unsigned i = 0;
|
||||
#ifdef POCO_OS_FAMILY_WINDOWS
|
||||
for (; prefix >= 16; ++i, prefix -= 16) {
|
||||
_addr.s6_addr16[i] = 0xffff;
|
||||
}
|
||||
if (prefix > 0)
|
||||
_addr.s6_addr16[i++] = htons(~(0xffff >> prefix));
|
||||
while (i < 8)
|
||||
_addr.s6_addr16[i++] = 0;
|
||||
#else
|
||||
for (; prefix >= 32; ++i, prefix -= 32) {
|
||||
_addr.s6_addr32[i] = 0xffffffff;
|
||||
}
|
||||
if (prefix > 0)
|
||||
_addr.s6_addr32[i++] = htonl(~(0xffffffffU >> prefix));
|
||||
while (i < 4)
|
||||
_addr.s6_addr32[i++] = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
std::string IPv6AddressImpl::toString() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
if (isIPv4Compatible() || isIPv4Mapped())
|
||||
{
|
||||
std::string result;
|
||||
result.reserve(24);
|
||||
if (words[5] == 0)
|
||||
result.append("::");
|
||||
else
|
||||
result.append("::ffff:");
|
||||
const UInt8* bytes = reinterpret_cast<const UInt8*>(&_addr);
|
||||
NumberFormatter::append(result, bytes[12]);
|
||||
result.append(".");
|
||||
NumberFormatter::append(result, bytes[13]);
|
||||
result.append(".");
|
||||
NumberFormatter::append(result, bytes[14]);
|
||||
result.append(".");
|
||||
NumberFormatter::append(result, bytes[15]);
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string result;
|
||||
result.reserve(64);
|
||||
bool zeroSequence = false;
|
||||
int i = 0;
|
||||
while (i < 8)
|
||||
{
|
||||
if (!zeroSequence && words[i] == 0)
|
||||
{
|
||||
int zi = i;
|
||||
while (zi < 8 && words[zi] == 0) ++zi;
|
||||
if (zi > i + 1)
|
||||
{
|
||||
i = zi;
|
||||
result.append(":");
|
||||
zeroSequence = true;
|
||||
}
|
||||
}
|
||||
if (i > 0) result.append(":");
|
||||
if (i < 8) NumberFormatter::appendHex(result, ntohs(words[i++]));
|
||||
}
|
||||
if (_scope > 0)
|
||||
{
|
||||
result.append("%");
|
||||
#if defined(_WIN32)
|
||||
NumberFormatter::append(result, _scope);
|
||||
#else
|
||||
char buffer[IFNAMSIZ];
|
||||
if (if_indextoname(_scope, buffer))
|
||||
{
|
||||
result.append(buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
NumberFormatter::append(result, _scope);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return toLower(result);
|
||||
}
|
||||
}
|
||||
|
||||
poco_socklen_t IPv6AddressImpl::length() const
|
||||
{
|
||||
return sizeof(_addr);
|
||||
}
|
||||
|
||||
const void* IPv6AddressImpl::addr() const
|
||||
{
|
||||
return &_addr;
|
||||
}
|
||||
|
||||
IPAddressImpl::Family IPv6AddressImpl::family() const
|
||||
{
|
||||
return IPAddressImpl::IPv6;
|
||||
}
|
||||
|
||||
int IPv6AddressImpl::af() const
|
||||
{
|
||||
return AF_INET6;
|
||||
}
|
||||
|
||||
unsigned IPv6AddressImpl::prefixLength() const
|
||||
{
|
||||
unsigned bits = 0;
|
||||
unsigned bitPos = 128;
|
||||
#if defined(POCO_OS_FAMILY_UNIX)
|
||||
for (int i = 3; i >= 0; --i)
|
||||
{
|
||||
unsigned addr = ntohl(_addr.s6_addr32[i]);
|
||||
if ((bits = maskBits(addr, 32))) return (bitPos - (32 - bits));
|
||||
bitPos -= 32;
|
||||
}
|
||||
return 0;
|
||||
#elif defined(POCO_OS_FAMILY_WINDOWS)
|
||||
for (int i = 7; i >= 0; --i)
|
||||
{
|
||||
unsigned short addr = ntohs(_addr.s6_addr16[i]);
|
||||
if ((bits = maskBits(addr, 16))) return (bitPos - (16 - bits));
|
||||
bitPos -= 16;
|
||||
}
|
||||
return 0;
|
||||
#else
|
||||
#warning prefixLength() not implemented
|
||||
throw NotImplementedException("prefixLength() not implemented");
|
||||
#endif
|
||||
}
|
||||
Poco::UInt32 IPv6AddressImpl::scope() const
|
||||
{
|
||||
return _scope;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isWildcard() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 &&
|
||||
words[4] == 0 && words[5] == 0 && words[6] == 0 && words[7] == 0;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isBroadcast() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isLoopback() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 &&
|
||||
words[4] == 0 && words[5] == 0 && words[6] == 0 && ntohs(words[7]) == 0x0001;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isMulticast() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return (ntohs(words[0]) & 0xFFE0) == 0xFF00;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isLinkLocal() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return (ntohs(words[0]) & 0xFFE0) == 0xFE80;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isSiteLocal() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return ((ntohs(words[0]) & 0xFFE0) == 0xFEC0) || ((ntohs(words[0]) & 0xFF00) == 0xFC00);
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isIPv4Compatible() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 && words[4] == 0 && words[5] == 0;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isIPv4Mapped() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return words[0] == 0 && words[1] == 0 && words[2] == 0 && words[3] == 0 && words[4] == 0 && ntohs(words[5]) == 0xFFFF;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isWellKnownMC() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return (ntohs(words[0]) & 0xFFF0) == 0xFF00;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isNodeLocalMC() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return (ntohs(words[0]) & 0xFFEF) == 0xFF01;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isLinkLocalMC() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return (ntohs(words[0]) & 0xFFEF) == 0xFF02;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isSiteLocalMC() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return (ntohs(words[0]) & 0xFFEF) == 0xFF05;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isOrgLocalMC() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return (ntohs(words[0]) & 0xFFEF) == 0xFF08;
|
||||
}
|
||||
|
||||
bool IPv6AddressImpl::isGlobalMC() const
|
||||
{
|
||||
const UInt16* words = reinterpret_cast<const UInt16*>(&_addr);
|
||||
return (ntohs(words[0]) & 0xFFEF) == 0xFF0F;
|
||||
}
|
||||
|
||||
IPv6AddressImpl IPv6AddressImpl::parse(const std::string& addr)
|
||||
{
|
||||
if (addr.empty()) return IPv6AddressImpl();
|
||||
#if defined(_WIN32)
|
||||
struct addrinfo* pAI;
|
||||
struct addrinfo hints;
|
||||
std::memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_flags = AI_NUMERICHOST;
|
||||
int rc = getaddrinfo(addr.c_str(), NULL, &hints, &pAI);
|
||||
if (rc == 0)
|
||||
{
|
||||
IPv6AddressImpl result = IPv6AddressImpl(&reinterpret_cast<struct sockaddr_in6*>(pAI->ai_addr)->sin6_addr, static_cast<int>(reinterpret_cast<struct sockaddr_in6*>(pAI->ai_addr)->sin6_scope_id));
|
||||
freeaddrinfo(pAI);
|
||||
return result;
|
||||
}
|
||||
else return IPv6AddressImpl();
|
||||
#else
|
||||
struct in6_addr ia;
|
||||
std::string::size_type pos = addr.find('%');
|
||||
if (std::string::npos != pos)
|
||||
{
|
||||
std::string::size_type start = ('[' == addr[0]) ? 1 : 0;
|
||||
std::string unscopedAddr(addr, start, pos - start);
|
||||
std::string scope(addr, pos + 1, addr.size() - start - pos);
|
||||
Poco::UInt32 scopeId(0);
|
||||
if (!(scopeId = if_nametoindex(scope.c_str())))
|
||||
return 0;
|
||||
if (inet_pton(AF_INET6, unscopedAddr.c_str(), &ia) == 1)
|
||||
return IPv6AddressImpl(&ia, scopeId);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (inet_pton(AF_INET6, addr.c_str(), &ia) == 1)
|
||||
return new IPv6AddressImpl(&ia);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void IPv6AddressImpl::mask(const IPAddressImpl* pMask, const IPAddressImpl* pSet)
|
||||
{
|
||||
throw Poco::NotImplementedException("mask() is only supported for IPv4 addresses");
|
||||
}
|
||||
|
||||
IPAddressImpl* IPv6AddressImpl::clone() const
|
||||
{
|
||||
return new IPv6AddressImpl(&_addr, _scope);
|
||||
}
|
||||
|
||||
IPv6AddressImpl IPv6AddressImpl::operator & (const IPv6AddressImpl& addr) const
|
||||
{
|
||||
IPv6AddressImpl result(&_addr);
|
||||
#ifdef POCO_OS_FAMILY_WINDOWS
|
||||
result._addr.s6_addr16[0] &= addr._addr.s6_addr16[0];
|
||||
result._addr.s6_addr16[1] &= addr._addr.s6_addr16[1];
|
||||
result._addr.s6_addr16[2] &= addr._addr.s6_addr16[2];
|
||||
result._addr.s6_addr16[3] &= addr._addr.s6_addr16[3];
|
||||
result._addr.s6_addr16[4] &= addr._addr.s6_addr16[4];
|
||||
result._addr.s6_addr16[5] &= addr._addr.s6_addr16[5];
|
||||
result._addr.s6_addr16[6] &= addr._addr.s6_addr16[6];
|
||||
result._addr.s6_addr16[7] &= addr._addr.s6_addr16[7];
|
||||
#else
|
||||
result._addr.s6_addr32[0] &= addr._addr.s6_addr32[0];
|
||||
result._addr.s6_addr32[1] &= addr._addr.s6_addr32[1];
|
||||
result._addr.s6_addr32[2] &= addr._addr.s6_addr32[2];
|
||||
result._addr.s6_addr32[3] &= addr._addr.s6_addr32[3];
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
IPv6AddressImpl IPv6AddressImpl::operator | (const IPv6AddressImpl& addr) const
|
||||
{
|
||||
IPv6AddressImpl result(&_addr);
|
||||
#ifdef POCO_OS_FAMILY_WINDOWS
|
||||
result._addr.s6_addr16[0] |= addr._addr.s6_addr16[0];
|
||||
result._addr.s6_addr16[1] |= addr._addr.s6_addr16[1];
|
||||
result._addr.s6_addr16[2] |= addr._addr.s6_addr16[2];
|
||||
result._addr.s6_addr16[3] |= addr._addr.s6_addr16[3];
|
||||
result._addr.s6_addr16[4] |= addr._addr.s6_addr16[4];
|
||||
result._addr.s6_addr16[5] |= addr._addr.s6_addr16[5];
|
||||
result._addr.s6_addr16[6] |= addr._addr.s6_addr16[6];
|
||||
result._addr.s6_addr16[7] |= addr._addr.s6_addr16[7];
|
||||
#else
|
||||
result._addr.s6_addr32[0] |= addr._addr.s6_addr32[0];
|
||||
result._addr.s6_addr32[1] |= addr._addr.s6_addr32[1];
|
||||
result._addr.s6_addr32[2] |= addr._addr.s6_addr32[2];
|
||||
result._addr.s6_addr32[3] |= addr._addr.s6_addr32[3];
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
IPv6AddressImpl IPv6AddressImpl::operator ^ (const IPv6AddressImpl& addr) const
|
||||
{
|
||||
IPv6AddressImpl result(&_addr);
|
||||
#ifdef POCO_OS_FAMILY_WINDOWS
|
||||
result._addr.s6_addr16[0] ^= addr._addr.s6_addr16[0];
|
||||
result._addr.s6_addr16[1] ^= addr._addr.s6_addr16[1];
|
||||
result._addr.s6_addr16[2] ^= addr._addr.s6_addr16[2];
|
||||
result._addr.s6_addr16[3] ^= addr._addr.s6_addr16[3];
|
||||
result._addr.s6_addr16[4] ^= addr._addr.s6_addr16[4];
|
||||
result._addr.s6_addr16[5] ^= addr._addr.s6_addr16[5];
|
||||
result._addr.s6_addr16[6] ^= addr._addr.s6_addr16[6];
|
||||
result._addr.s6_addr16[7] ^= addr._addr.s6_addr16[7];
|
||||
#else
|
||||
result._addr.s6_addr32[0] ^= addr._addr.s6_addr32[0];
|
||||
result._addr.s6_addr32[1] ^= addr._addr.s6_addr32[1];
|
||||
result._addr.s6_addr32[2] ^= addr._addr.s6_addr32[2];
|
||||
result._addr.s6_addr32[3] ^= addr._addr.s6_addr32[3];
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
IPv6AddressImpl IPv6AddressImpl::operator ~ () const
|
||||
{
|
||||
IPv6AddressImpl result(&_addr);
|
||||
#ifdef POCO_OS_FAMILY_WINDOWS
|
||||
result._addr.s6_addr16[0] ^= 0xffff;
|
||||
result._addr.s6_addr16[1] ^= 0xffff;
|
||||
result._addr.s6_addr16[2] ^= 0xffff;
|
||||
result._addr.s6_addr16[3] ^= 0xffff;
|
||||
result._addr.s6_addr16[4] ^= 0xffff;
|
||||
result._addr.s6_addr16[5] ^= 0xffff;
|
||||
result._addr.s6_addr16[6] ^= 0xffff;
|
||||
result._addr.s6_addr16[7] ^= 0xffff;
|
||||
#else
|
||||
result._addr.s6_addr32[0] ^= 0xffffffff;
|
||||
result._addr.s6_addr32[1] ^= 0xffffffff;
|
||||
result._addr.s6_addr32[2] ^= 0xffffffff;
|
||||
result._addr.s6_addr32[3] ^= 0xffffffff;
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
bool IPv6AddressImpl::operator == (const IPv6AddressImpl& addr) const
|
||||
{
|
||||
return 0 == std::memcmp(&addr._addr, &_addr, sizeof(_addr));
|
||||
}
|
||||
|
||||
|
||||
bool IPv6AddressImpl::operator != (const IPv6AddressImpl& addr) const
|
||||
{
|
||||
return !(*this == addr);
|
||||
}
|
||||
|
||||
|
||||
#endif // POCO_HAVE_IPv6
|
||||
|
||||
|
||||
} } } // namespace Poco::Net::Impl
|
Loading…
x
Reference in New Issue
Block a user