From d64ec94653b8d22ffab8a1399c173795fe0d6a6e Mon Sep 17 00:00:00 2001 From: Guenter Obiltschnig Date: Tue, 8 Sep 2015 14:15:38 +0200 Subject: [PATCH] UNIX domain sockets support: replace IPAddress::Family with new enum AddressFamily::Family enum --- Net/include/Poco/Net/DatagramSocket.h | 2 +- Net/include/Poco/Net/DatagramSocketImpl.h | 2 +- Net/include/Poco/Net/ICMPClient.h | 6 ++-- Net/include/Poco/Net/ICMPPacket.h | 2 +- Net/include/Poco/Net/ICMPSocket.h | 2 +- Net/include/Poco/Net/ICMPSocketImpl.h | 2 +- Net/include/Poco/Net/IPAddress.h | 16 +++++----- Net/include/Poco/Net/IPAddressImpl.h | 9 +----- Net/include/Poco/Net/MulticastSocket.h | 2 +- Net/include/Poco/Net/NTPClient.h | 4 +-- Net/include/Poco/Net/RawSocket.h | 2 +- Net/include/Poco/Net/RawSocketImpl.h | 2 +- Net/include/Poco/Net/SocketAddress.h | 24 +++++++-------- Net/include/Poco/Net/SocketAddressImpl.h | 19 ++++-------- Net/include/Poco/Net/SocketDefs.h | 28 ++++++++++++++++++ Net/include/Poco/Net/StreamSocket.h | 2 +- Net/include/Poco/Net/StreamSocketImpl.h | 2 +- Net/src/DatagramSocket.cpp | 2 +- Net/src/DatagramSocketImpl.cpp | 10 +++++-- Net/src/ICMPClient.cpp | 2 +- Net/src/IPAddress.cpp | 6 ++++ Net/src/IPAddressImpl.cpp | 6 ++-- Net/src/MulticastSocket.cpp | 9 ++++-- Net/src/RawSocket.cpp | 2 +- Net/src/RawSocketImpl.cpp | 6 ++-- Net/src/SocketAddress.cpp | 19 +++++++++--- Net/src/SocketAddressImpl.cpp | 5 ++-- Net/src/StreamSocket.cpp | 2 +- Net/src/StreamSocketImpl.cpp | 10 +++++-- Net/testsuite/src/SocketAddressTest.cpp | 36 +++++++++++++++++++++++ Net/testsuite/src/SocketAddressTest.h | 1 + 31 files changed, 161 insertions(+), 81 deletions(-) diff --git a/Net/include/Poco/Net/DatagramSocket.h b/Net/include/Poco/Net/DatagramSocket.h index 74c4c5e3d..cd93aa317 100644 --- a/Net/include/Poco/Net/DatagramSocket.h +++ b/Net/include/Poco/Net/DatagramSocket.h @@ -36,7 +36,7 @@ public: DatagramSocket(); /// Creates an unconnected IPv4 datagram socket. - explicit DatagramSocket(IPAddress::Family family); + explicit DatagramSocket(SocketAddress::Family family); /// Creates an unconnected datagram socket. /// /// The socket will be created for the diff --git a/Net/include/Poco/Net/DatagramSocketImpl.h b/Net/include/Poco/Net/DatagramSocketImpl.h index ce36cfeea..c6a30bdab 100644 --- a/Net/include/Poco/Net/DatagramSocketImpl.h +++ b/Net/include/Poco/Net/DatagramSocketImpl.h @@ -39,7 +39,7 @@ public: /// be an IPv6 socket. Otherwise, it will be /// an IPv4 socket. - explicit DatagramSocketImpl(IPAddress::Family family); + explicit DatagramSocketImpl(SocketAddress::Family family); /// Creates an unconnected datagram socket. /// /// The socket will be created for the diff --git a/Net/include/Poco/Net/ICMPClient.h b/Net/include/Poco/Net/ICMPClient.h index b3a27b686..275bf52d6 100644 --- a/Net/include/Poco/Net/ICMPClient.h +++ b/Net/include/Poco/Net/ICMPClient.h @@ -46,7 +46,7 @@ public: mutable Poco::BasicEvent pingError; mutable Poco::BasicEvent pingEnd; - explicit ICMPClient(IPAddress::Family family); + explicit ICMPClient(SocketAddress::Family family); /// Creates an ICMP client. ~ICMPClient(); @@ -64,7 +64,7 @@ public: /// /// Returns the number of valid replies. - static int ping(SocketAddress& address, IPAddress::Family family, int repeat = 1); + static int ping(SocketAddress& address, SocketAddress::Family family, int repeat = 1); /// Pings the specified address [repeat] times. /// Notifications are not posted for events. /// @@ -77,7 +77,7 @@ public: /// Returns the number of valid replies. private: - mutable IPAddress::Family _family; + mutable SocketAddress::Family _family; }; diff --git a/Net/include/Poco/Net/ICMPPacket.h b/Net/include/Poco/Net/ICMPPacket.h index 95f6d65a8..e8b3b5186 100644 --- a/Net/include/Poco/Net/ICMPPacket.h +++ b/Net/include/Poco/Net/ICMPPacket.h @@ -33,7 +33,7 @@ class Net_API ICMPPacket /// This class is the ICMP packet abstraction. { public: - ICMPPacket(IPAddress::Family family, int dataSize = 48); + ICMPPacket(SocketAddress::Family family, int dataSize = 48); /// Creates an ICMPPacket of specified family. ~ICMPPacket(); diff --git a/Net/include/Poco/Net/ICMPSocket.h b/Net/include/Poco/Net/ICMPSocket.h index b6253864c..3b98dd6e8 100644 --- a/Net/include/Poco/Net/ICMPSocket.h +++ b/Net/include/Poco/Net/ICMPSocket.h @@ -33,7 +33,7 @@ class Net_API ICMPSocket: public Socket /// ICMP client socket. { public: - ICMPSocket(IPAddress::Family family, int dataSize = 48, int ttl = 128, int timeout = 500000); + ICMPSocket(SocketAddress::Family family, int dataSize = 48, int ttl = 128, int timeout = 500000); /// Creates an unconnected ICMP socket. /// /// The socket will be created for the diff --git a/Net/include/Poco/Net/ICMPSocketImpl.h b/Net/include/Poco/Net/ICMPSocketImpl.h index c033e5af1..771c5a227 100644 --- a/Net/include/Poco/Net/ICMPSocketImpl.h +++ b/Net/include/Poco/Net/ICMPSocketImpl.h @@ -34,7 +34,7 @@ class Net_API ICMPSocketImpl: public RawSocketImpl /// This class implements an ICMP socket. { public: - ICMPSocketImpl(IPAddress::Family family, int dataSize, int ttl, int timeout); + ICMPSocketImpl(SocketAddress::Family family, int dataSize, int ttl, int timeout); /// Creates an unconnected ICMP socket. /// /// The socket will be created for the given address family. diff --git a/Net/include/Poco/Net/IPAddress.h b/Net/include/Poco/Net/IPAddress.h index 2ae11628a..fa6fe73f1 100644 --- a/Net/include/Poco/Net/IPAddress.h +++ b/Net/include/Poco/Net/IPAddress.h @@ -57,15 +57,15 @@ class Net_API IPAddress { public: typedef std::vector List; - - enum Family - /// Possible address families for IP addresses. - { - IPv4 = Poco::Net::Impl::IPAddressImpl::IPv4, -#ifdef POCO_HAVE_IPv6 - IPv6 = Poco::Net::Impl::IPAddressImpl::IPv6 + + // The following declarations keep the Family type + // backwards compatible with the previously used + // enum declaration. + typedef AddressFamily::Family Family; + static const Family IPv4 = AddressFamily::IPv4; +#if defined(POCO_HAVE_IPv6) + static const Family IPv6 = AddressFamily::IPv6; #endif - }; IPAddress(); /// Creates a wildcard (zero) IPv4 IPAddress. diff --git a/Net/include/Poco/Net/IPAddressImpl.h b/Net/include/Poco/Net/IPAddressImpl.h index 64587d2cf..d68049cee 100644 --- a/Net/include/Poco/Net/IPAddressImpl.h +++ b/Net/include/Poco/Net/IPAddressImpl.h @@ -39,14 +39,7 @@ class IPAddressImpl #endif { public: - enum Family - /// Possible address families for IP addresses. - { - IPv4, -#ifdef POCO_HAVE_IPv6 - IPv6 -#endif - }; + typedef AddressFamily::Family Family; virtual ~IPAddressImpl(); diff --git a/Net/include/Poco/Net/MulticastSocket.h b/Net/include/Poco/Net/MulticastSocket.h index b26801c64..88921c7a8 100644 --- a/Net/include/Poco/Net/MulticastSocket.h +++ b/Net/include/Poco/Net/MulticastSocket.h @@ -43,7 +43,7 @@ public: MulticastSocket(); /// Creates the MulticastSocket. - explicit MulticastSocket(IPAddress::Family family); + explicit MulticastSocket(SocketAddress::Family family); /// Creates an unconnected datagram socket. /// /// The socket will be created for the diff --git a/Net/include/Poco/Net/NTPClient.h b/Net/include/Poco/Net/NTPClient.h index b2967ff21..11c17c712 100644 --- a/Net/include/Poco/Net/NTPClient.h +++ b/Net/include/Poco/Net/NTPClient.h @@ -36,7 +36,7 @@ class Net_API NTPClient public: mutable Poco::BasicEvent response; - explicit NTPClient(IPAddress::Family family, int timeout = 3000000); + explicit NTPClient(SocketAddress::Family family, int timeout = 3000000); /// Creates an NTP client. ~NTPClient(); @@ -55,7 +55,7 @@ public: /// Returns the number of valid replies. private: - mutable IPAddress::Family _family; + mutable SocketAddress::Family _family; int _timeout; }; diff --git a/Net/include/Poco/Net/RawSocket.h b/Net/include/Poco/Net/RawSocket.h index f5e92765a..43efd7a95 100644 --- a/Net/include/Poco/Net/RawSocket.h +++ b/Net/include/Poco/Net/RawSocket.h @@ -36,7 +36,7 @@ public: RawSocket(); /// Creates an unconnected IPv4 raw socket. - RawSocket(IPAddress::Family family, int proto = IPPROTO_RAW); + RawSocket(SocketAddress::Family family, int proto = IPPROTO_RAW); /// Creates an unconnected raw socket. /// /// The socket will be created for the diff --git a/Net/include/Poco/Net/RawSocketImpl.h b/Net/include/Poco/Net/RawSocketImpl.h index 8bf056913..ab299e0d1 100644 --- a/Net/include/Poco/Net/RawSocketImpl.h +++ b/Net/include/Poco/Net/RawSocketImpl.h @@ -35,7 +35,7 @@ public: RawSocketImpl(); /// Creates an unconnected IPv4 raw socket with IPPROTO_RAW. - RawSocketImpl(IPAddress::Family family, int proto = IPPROTO_RAW); + RawSocketImpl(SocketAddress::Family family, int proto = IPPROTO_RAW); /// Creates an unconnected raw socket. /// /// The socket will be created for the diff --git a/Net/include/Poco/Net/SocketAddress.h b/Net/include/Poco/Net/SocketAddress.h index e47f091bc..f0dcea2e6 100644 --- a/Net/include/Poco/Net/SocketAddress.h +++ b/Net/include/Poco/Net/SocketAddress.h @@ -43,17 +43,17 @@ class Net_API SocketAddress /// host address and a port number. { public: - enum Family - /// Possible address families for socket addresses. - { - IPv4 = Poco::Net::Impl::SocketAddressImpl::IPv4, -#ifdef POCO_HAVE_IPv6 - IPv6 = Poco::Net::Impl::SocketAddressImpl::IPv6, + // The following declarations keep the Family type + // backwards compatible with the previously used + // enum declaration. + typedef AddressFamily::Family Family; + static const Family IPv4 = AddressFamily::IPv4; +#if defined(POCO_HAVE_IPv6) + static const Family IPv6 = AddressFamily::IPv6; #endif -#ifdef POCO_OS_FAMILY_UNIX - UNIX_LOCAL = Poco::Net::Impl::SocketAddressImpl::UNIX_LOCAL +#if defined(POCO_OS_FAMILY_UNIX) + static const Family UNIX_LOCAL = AddressFamily::UNIX_LOCAL; #endif - }; SocketAddress(); /// Creates a wildcard (all zero) IPv4 SocketAddress. @@ -316,16 +316,16 @@ inline bool SocketAddress::operator == (const SocketAddress& socketAddress) cons { #if defined(POCO_OS_FAMILY_UNIX) if (family() == UNIX_LOCAL) - return host() == socketAddress.host() && port() == socketAddress.port(); + return toString() == socketAddress.toString(); else #endif - return toString() == socketAddress.toString(); + return host() == socketAddress.host() && port() == socketAddress.port(); } inline bool SocketAddress::operator != (const SocketAddress& socketAddress) const { - return !operator == (socketAddress); + return !(operator == (socketAddress)); } diff --git a/Net/include/Poco/Net/SocketAddressImpl.h b/Net/include/Poco/Net/SocketAddressImpl.h index 01a52eb22..11253003b 100644 --- a/Net/include/Poco/Net/SocketAddressImpl.h +++ b/Net/include/Poco/Net/SocketAddressImpl.h @@ -27,6 +27,7 @@ #include "Poco/RefCountedObject.h" #endif + namespace Poco { namespace Net { namespace Impl { @@ -38,17 +39,7 @@ class Net_API SocketAddressImpl #endif { public: - enum Family - /// Possible address families for socket addresses. - { - IPv4, -#ifdef POCO_HAVE_IPv6 - IPv6, -#endif -#ifdef POCO_OS_FAMILY_UNIX - UNIX_LOCAL -#endif - }; + typedef AddressFamily::Family Family; virtual ~SocketAddressImpl(); @@ -124,7 +115,7 @@ inline int IPv4SocketAddressImpl::af() const inline SocketAddressImpl::Family IPv4SocketAddressImpl::family() const { - return SocketAddressImpl::IPv4; + return AddressFamily::IPv4; } @@ -186,7 +177,7 @@ inline int IPv6SocketAddressImpl::af() const inline SocketAddressImpl::Family IPv6SocketAddressImpl::family() const { - return SocketAddressImpl::IPv6; + return AddressFamily::IPv6; } @@ -254,7 +245,7 @@ inline int LocalSocketAddressImpl::af() const inline SocketAddressImpl::Family LocalSocketAddressImpl::family() const { - return SocketAddressImpl::UNIX_LOCAL; + return AddressFamily::UNIX_LOCAL; } diff --git a/Net/include/Poco/Net/SocketDefs.h b/Net/include/Poco/Net/SocketDefs.h index ccc91fa16..635fb2f9b 100644 --- a/Net/include/Poco/Net/SocketDefs.h +++ b/Net/include/Poco/Net/SocketDefs.h @@ -353,4 +353,32 @@ #endif +namespace Poco { +namespace Net { + + +struct AddressFamily + /// AddressFamily::Family replaces the previously used IPAddress::Family + /// enumeration and is now used for IPAddress::Family and SocketAddress::Family. +{ + enum Family + /// Possible address families for socket addresses. + { + IPv4, + /// IPv4 address family. + #if defined(POCO_HAVE_IPv6) + IPv6, + /// IPv6 address family. + #endif + #if defined(POCO_OS_FAMILY_UNIX) + UNIX_LOCAL + /// UNIX domain socket address family. Available on UNIX/POSIX platforms only. + #endif + }; +}; + + +} } // namespace Poco::Net + + #endif // Net_SocketDefs_INCLUDED diff --git a/Net/include/Poco/Net/StreamSocket.h b/Net/include/Poco/Net/StreamSocket.h index 302fb58bc..038e6b361 100644 --- a/Net/include/Poco/Net/StreamSocket.h +++ b/Net/include/Poco/Net/StreamSocket.h @@ -47,7 +47,7 @@ public: /// Creates a stream socket and connects it to /// the socket specified by address. - explicit StreamSocket(IPAddress::Family family); + explicit StreamSocket(SocketAddress::Family family); /// Creates an unconnected stream socket /// for the given address family. /// diff --git a/Net/include/Poco/Net/StreamSocketImpl.h b/Net/include/Poco/Net/StreamSocketImpl.h index ee91283a9..bfb588de4 100644 --- a/Net/include/Poco/Net/StreamSocketImpl.h +++ b/Net/include/Poco/Net/StreamSocketImpl.h @@ -35,7 +35,7 @@ public: StreamSocketImpl(); /// Creates a StreamSocketImpl. - explicit StreamSocketImpl(IPAddress::Family addressFamily); + explicit StreamSocketImpl(SocketAddress::Family addressFamily); /// Creates a SocketImpl, with the underlying /// socket initialized for the given address family. diff --git a/Net/src/DatagramSocket.cpp b/Net/src/DatagramSocket.cpp index a2089ab7e..ce5d6b7ee 100644 --- a/Net/src/DatagramSocket.cpp +++ b/Net/src/DatagramSocket.cpp @@ -31,7 +31,7 @@ DatagramSocket::DatagramSocket(): Socket(new DatagramSocketImpl) } -DatagramSocket::DatagramSocket(IPAddress::Family family): Socket(new DatagramSocketImpl(family)) +DatagramSocket::DatagramSocket(SocketAddress::Family family): Socket(new DatagramSocketImpl(family)) { } diff --git a/Net/src/DatagramSocketImpl.cpp b/Net/src/DatagramSocketImpl.cpp index 1b31b80d3..ef2b50881 100644 --- a/Net/src/DatagramSocketImpl.cpp +++ b/Net/src/DatagramSocketImpl.cpp @@ -31,13 +31,17 @@ DatagramSocketImpl::DatagramSocketImpl() } -DatagramSocketImpl::DatagramSocketImpl(IPAddress::Family family) +DatagramSocketImpl::DatagramSocketImpl(SocketAddress::Family family) { - if (family == IPAddress::IPv4) + if (family == SocketAddress::IPv4) init(AF_INET); #if defined(POCO_HAVE_IPv6) - else if (family == IPAddress::IPv6) + else if (family == SocketAddress::IPv6) init(AF_INET6); +#endif +#if defined(POCO_OS_FAMILY_UNIX) + else if (family == SocketAddress::UNIX_LOCAL) + init(AF_UNIX); #endif else throw InvalidArgumentException("Invalid or unsupported address family passed to DatagramSocketImpl"); } diff --git a/Net/src/ICMPClient.cpp b/Net/src/ICMPClient.cpp index a4b66bf10..d3a164f0e 100644 --- a/Net/src/ICMPClient.cpp +++ b/Net/src/ICMPClient.cpp @@ -36,7 +36,7 @@ namespace Poco { namespace Net { -ICMPClient::ICMPClient(IPAddress::Family family): +ICMPClient::ICMPClient(SocketAddress::Family family): _family(family) { } diff --git a/Net/src/IPAddress.cpp b/Net/src/IPAddress.cpp index 326fbbe9b..e3d0039a5 100644 --- a/Net/src/IPAddress.cpp +++ b/Net/src/IPAddress.cpp @@ -42,6 +42,12 @@ namespace Poco { namespace Net { +const IPAddress::Family IPAddress::IPv4; +#if defined(POCO_HAVE_IPv6) +const IPAddress::Family IPAddress::IPv6; +#endif + + IPAddress::IPAddress() { newIPv4(); diff --git a/Net/src/IPAddressImpl.cpp b/Net/src/IPAddressImpl.cpp index 5097bbb5d..dd20bd052 100644 --- a/Net/src/IPAddressImpl.cpp +++ b/Net/src/IPAddressImpl.cpp @@ -145,7 +145,7 @@ const void* IPv4AddressImpl::addr() const IPAddressImpl::Family IPv4AddressImpl::family() const { - return IPAddressImpl::IPv4; + return AddressFamily::IPv4; } @@ -499,7 +499,7 @@ const void* IPv6AddressImpl::addr() const IPAddressImpl::Family IPv6AddressImpl::family() const { - return IPAddressImpl::IPv6; + return AddressFamily::IPv6; } @@ -534,6 +534,8 @@ unsigned IPv6AddressImpl::prefixLength() const throw NotImplementedException("prefixLength() not implemented"); #endif } + + Poco::UInt32 IPv6AddressImpl::scope() const { return _scope; diff --git a/Net/src/MulticastSocket.cpp b/Net/src/MulticastSocket.cpp index e14f8ffb4..5dcd9a8e8 100644 --- a/Net/src/MulticastSocket.cpp +++ b/Net/src/MulticastSocket.cpp @@ -53,8 +53,12 @@ MulticastSocket::MulticastSocket() } -MulticastSocket::MulticastSocket(IPAddress::Family family): DatagramSocket(family) +MulticastSocket::MulticastSocket(SocketAddress::Family family): DatagramSocket(family) { +#if defined(POCO_OS_FAMILY_UNIX) + if (family == SocketAddress::UNIX_LOCAL) + throw Poco::InvalidArgumentException("Cannot create a MulticastSocket with UNIX_LOCAL socket"); +#endif } @@ -92,8 +96,7 @@ void MulticastSocket::setInterface(const NetworkInterface& interfc) impl()->setOption(IPPROTO_IPV6, IPV6_MULTICAST_IF, interfc.index()); } #endif - else - throw UnsupportedFamilyException("Unknown or unsupported socket family."); + else throw UnsupportedFamilyException("Unknown or unsupported socket family."); } diff --git a/Net/src/RawSocket.cpp b/Net/src/RawSocket.cpp index 3506a814d..2f35c3027 100644 --- a/Net/src/RawSocket.cpp +++ b/Net/src/RawSocket.cpp @@ -32,7 +32,7 @@ RawSocket::RawSocket(): } -RawSocket::RawSocket(IPAddress::Family family, int proto): +RawSocket::RawSocket(SocketAddress::Family family, int proto): Socket(new RawSocketImpl(family, proto)) { } diff --git a/Net/src/RawSocketImpl.cpp b/Net/src/RawSocketImpl.cpp index e06942f69..0377a08c1 100644 --- a/Net/src/RawSocketImpl.cpp +++ b/Net/src/RawSocketImpl.cpp @@ -31,12 +31,12 @@ RawSocketImpl::RawSocketImpl() } -RawSocketImpl::RawSocketImpl(IPAddress::Family family, int proto) +RawSocketImpl::RawSocketImpl(SocketAddress::Family family, int proto) { - if (family == IPAddress::IPv4) + if (family == SocketAddress::IPv4) init2(AF_INET, proto); #if defined(POCO_HAVE_IPv6) - else if (family == IPAddress::IPv6) + else if (family == SocketAddress::IPv6) init2(AF_INET6, proto); #endif else throw InvalidArgumentException("Invalid or unsupported address family passed to RawSocketImpl"); diff --git a/Net/src/SocketAddress.cpp b/Net/src/SocketAddress.cpp index 2b9bf26d8..324dfa9b5 100644 --- a/Net/src/SocketAddress.cpp +++ b/Net/src/SocketAddress.cpp @@ -58,6 +58,15 @@ struct AFLT // +const SocketAddress::Family SocketAddress::IPv4; +#if defined(POCO_HAVE_IPv6) +const SocketAddress::Family SocketAddress::IPv6; +#endif +#if defined(POCO_OS_FAMILY_UNIX) +const SocketAddress::Family SocketAddress::UNIX_LOCAL; +#endif + + SocketAddress::SocketAddress() { newIPv4(); @@ -117,17 +126,17 @@ SocketAddress::SocketAddress(const SocketAddress& socketAddress) SocketAddress::SocketAddress(const struct sockaddr* sockAddr, poco_socklen_t length) { - if (length == sizeof(struct sockaddr_in)) + if (length == sizeof(struct sockaddr_in) && sockAddr->sa_family == AF_INET) newIPv4(reinterpret_cast(sockAddr)); #if defined(POCO_HAVE_IPv6) - else if (length == sizeof(struct sockaddr_in6)) + else if (length == sizeof(struct sockaddr_in6) && sockAddr->sa_family == AF_INET6) newIPv6(reinterpret_cast(sockAddr)); #endif #if defined(POCO_OS_FAMILY_UNIX) else if (length > 0 && length <= sizeof(struct sockaddr_un) && sockAddr->sa_family == AF_UNIX) newLocal(reinterpret_cast(sockAddr)); #endif - else throw Poco::InvalidArgumentException("Invalid address length passed to SocketAddress()"); + else throw Poco::InvalidArgumentException("Invalid address length or family passed to SocketAddress()"); } @@ -263,6 +272,8 @@ void SocketAddress::init(Family family, const std::string& address) void SocketAddress::init(const std::string& hostAndPort) { + poco_assert (!hostAndPort.empty()); + std::string host; std::string port; std::string::const_iterator it = hostAndPort.begin(); @@ -332,7 +343,7 @@ Poco::BinaryReader& operator >> (Poco::BinaryReader& reader, Poco::Net::SocketAd } -inline std::ostream& operator << (std::ostream& ostr, const Poco::Net::SocketAddress& address) +std::ostream& operator << (std::ostream& ostr, const Poco::Net::SocketAddress& address) { ostr << address.toString(); return ostr; diff --git a/Net/src/SocketAddressImpl.cpp b/Net/src/SocketAddressImpl.cpp index 9cb60bb06..02715af8b 100644 --- a/Net/src/SocketAddressImpl.cpp +++ b/Net/src/SocketAddressImpl.cpp @@ -63,6 +63,7 @@ IPv4SocketAddressImpl::IPv4SocketAddressImpl(const void* addr, UInt16 port) { std::memset(&_addr, 0, sizeof(_addr)); _addr.sin_family = AF_INET; + poco_set_sin_len(&_addr); std::memcpy(&_addr.sin_addr, addr, sizeof(_addr.sin_addr)); _addr.sin_port = port; } @@ -73,7 +74,7 @@ std::string IPv4SocketAddressImpl::toString() const std::string result; result.append(host().toString()); result.append(":"); - NumberFormatter::append(result, port()); + NumberFormatter::append(result, ntohs(port())); return result; } @@ -120,7 +121,7 @@ std::string IPv6SocketAddressImpl::toString() const result.append(host().toString()); result.append("]"); result.append(":"); - NumberFormatter::append(result, port()); + NumberFormatter::append(result, ntohs(port())); return result; } diff --git a/Net/src/StreamSocket.cpp b/Net/src/StreamSocket.cpp index 8ff4b3921..ba35a9aff 100644 --- a/Net/src/StreamSocket.cpp +++ b/Net/src/StreamSocket.cpp @@ -41,7 +41,7 @@ StreamSocket::StreamSocket(const SocketAddress& address): Socket(new StreamSocke } -StreamSocket::StreamSocket(IPAddress::Family family): Socket(new StreamSocketImpl(family)) +StreamSocket::StreamSocket(SocketAddress::Family family): Socket(new StreamSocketImpl(family)) { } diff --git a/Net/src/StreamSocketImpl.cpp b/Net/src/StreamSocketImpl.cpp index 94e683cb3..06b736fa7 100644 --- a/Net/src/StreamSocketImpl.cpp +++ b/Net/src/StreamSocketImpl.cpp @@ -28,13 +28,17 @@ StreamSocketImpl::StreamSocketImpl() } -StreamSocketImpl::StreamSocketImpl(IPAddress::Family family) +StreamSocketImpl::StreamSocketImpl(SocketAddress::Family family) { - if (family == IPAddress::IPv4) + if (family == SocketAddress::IPv4) init(AF_INET); #if defined(POCO_HAVE_IPv6) - else if (family == IPAddress::IPv6) + else if (family == SocketAddress::IPv6) init(AF_INET6); +#endif +#if defined(POCO_OS_FAMILY_UNIX) + else if (family == SocketAddress::UNIX_LOCAL) + init(AF_UNIX); #endif else throw Poco::InvalidArgumentException("Invalid or unsupported address family passed to StreamSocketImpl"); } diff --git a/Net/testsuite/src/SocketAddressTest.cpp b/Net/testsuite/src/SocketAddressTest.cpp index bd1b22843..e174c15f4 100644 --- a/Net/testsuite/src/SocketAddressTest.cpp +++ b/Net/testsuite/src/SocketAddressTest.cpp @@ -43,8 +43,11 @@ void SocketAddressTest::testSocketAddress() assert (wild.port() == 0); SocketAddress sa1("192.168.1.100", 100); + assert (sa1.af() == AF_INET); + assert (sa1.family() == SocketAddress::IPv4); assert (sa1.host().toString() == "192.168.1.100"); assert (sa1.port() == 100); + assert (sa1.toString() == "192.168.1.100:100"); SocketAddress sa2("192.168.1.100", "100"); assert (sa2.host().toString() == "192.168.1.100"); @@ -135,6 +138,38 @@ void SocketAddressTest::testSocketRelationals() void SocketAddressTest::testSocketAddress6() { #ifdef POCO_HAVE_IPv6 + SocketAddress sa1("FE80::E6CE:8FFF:FE4A:EDD0", 100); + assert (sa1.af() == AF_INET6); + assert (sa1.family() == SocketAddress::IPv6); + assert (sa1.host().toString() == "fe80::e6ce:8fff:fe4a:edd0"); + assert (sa1.port() == 100); + assert (sa1.toString() == "[fe80::e6ce:8fff:fe4a:edd0]:100"); + + SocketAddress sa2("[FE80::E6CE:8FFF:FE4A:EDD0]:100"); + assert (sa2.af() == AF_INET6); + assert (sa2.family() == SocketAddress::IPv6); + assert (sa2.host().toString() == "fe80::e6ce:8fff:fe4a:edd0"); + assert (sa2.port() == 100); + assert (sa2.toString() == "[fe80::e6ce:8fff:fe4a:edd0]:100"); +#endif +} + + +void SocketAddressTest::testSocketAddressUnixLocal() +{ +#ifdef POCO_OS_FAMILY_UNIX + SocketAddress sa1(SocketAddress::UNIX_LOCAL, "/tmp/sock1"); + assert (sa1.af() == AF_UNIX); + assert (sa1.family() == SocketAddress::UNIX_LOCAL); + assert (sa1.toString() == "/tmp/sock1"); + + SocketAddress sa2(SocketAddress::UNIX_LOCAL, "/tmp/sock2"); + assert (sa1 != sa2); + assert (sa1 < sa2); + + SocketAddress sa3(SocketAddress::UNIX_LOCAL, "/tmp/sock1"); + assert (sa1 == sa3); + assert (!(sa1 < sa3)); #endif } @@ -156,6 +191,7 @@ CppUnit::Test* SocketAddressTest::suite() CppUnit_addTest(pSuite, SocketAddressTest, testSocketAddress); CppUnit_addTest(pSuite, SocketAddressTest, testSocketRelationals); CppUnit_addTest(pSuite, SocketAddressTest, testSocketAddress6); + CppUnit_addTest(pSuite, SocketAddressTest, testSocketAddressUnixLocal); return pSuite; } diff --git a/Net/testsuite/src/SocketAddressTest.h b/Net/testsuite/src/SocketAddressTest.h index 75cbe67b7..2faa081c5 100644 --- a/Net/testsuite/src/SocketAddressTest.h +++ b/Net/testsuite/src/SocketAddressTest.h @@ -29,6 +29,7 @@ public: void testSocketAddress(); void testSocketRelationals(); void testSocketAddress6(); + void testSocketAddressUnixLocal(); void setUp(); void tearDown();