X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FINet%2FINetAddressing.cc;h=e224408f1bc827a32764ee78eb36985c8873681f;hb=5443435c4c2b6e4386c5334b5b8358273f2bae93;hp=d3c4e3612abbd110f5d64d9063feca136798f064;hpb=3cb0a2ff50b8f1111da34b696e64fb1b037cd683;p=senf.git diff --git a/Socket/Protocols/INet/INetAddressing.cc b/Socket/Protocols/INet/INetAddressing.cc index d3c4e36..e224408 100644 --- a/Socket/Protocols/INet/INetAddressing.cc +++ b/Socket/Protocols/INet/INetAddressing.cc @@ -44,11 +44,11 @@ // senf::INet4SocketAddress prefix_ senf::INet4SocketAddress::INet4SocketAddress(std::string const & addr) + : BSDSocketAddress (sizeof(sockaddr_in), AF_INET) { - clear(); - unsigned portIx = addr.find(':'); + std::string::size_type portIx = addr.find(':'); try { - port( boost::lexical_cast< ::u_int16_t >(portIx == std::string::npos + port( boost::lexical_cast< ::u_int16_t >(portIx == std::string::npos ? addr : std::string(addr,portIx+1)) ); } catch (boost::bad_lexical_cast const &) { @@ -59,22 +59,36 @@ prefix_ senf::INet4SocketAddress::INet4SocketAddress(std::string const & addr) } prefix_ senf::INet4SocketAddress::INet4SocketAddress(INet4Address const & addr, unsigned p) + : BSDSocketAddress (sizeof(sockaddr_in), AF_INET) { - clear(); address(addr); port(p); } prefix_ senf::INet4SocketAddress::INet4SocketAddress(unsigned p) + : BSDSocketAddress (sizeof(sockaddr_in), AF_INET) { - clear(); port(p); } -prefix_ void senf::INet4SocketAddress::clear() +prefix_ std::ostream & senf::operator<<(std::ostream & os, INet4SocketAddress const & addr) { - ::memset(&addr_,0,sizeof(addr_)); - addr_.sin_family = AF_INET; + os << addr.address() << ":" << addr.port(); + return os; +} + +prefix_ std::istream & senf::operator>>(std::istream & is, INet4SocketAddress & addr) +{ + std::string s; + if (!(is >> s)) + return is; + try { + addr = INet4SocketAddress(s); + } + catch (AddressException &) { + is.setstate(std::ios::failbit); + } + return is; } /////////////////////////////////////////////////////////////////////////// @@ -82,9 +96,8 @@ prefix_ void senf::INet4SocketAddress::clear() prefix_ senf::INet6SocketAddress::INet6SocketAddress(std::string const & addr, INet6Address::Resolve_t resolve) + : BSDSocketAddress (sizeof(sockaddr_in6), AF_INET6) { - clear(); - // Format of addr: "[" address [ "%" interface ] "]" ":" port // or: host ":" port // or: port @@ -95,7 +108,7 @@ prefix_ senf::INet6SocketAddress::INet6SocketAddress(std::string const & addr, ZoneId = 2, Hostname = 3, Port = 4 }; - + boost::smatch match; if (! regex_match(addr, match, addressRx)) throw AddressSyntaxException(); @@ -113,20 +126,6 @@ prefix_ senf::INet6SocketAddress::INet6SocketAddress(std::string const & addr, } } -prefix_ bool senf::INet6SocketAddress::operator==(INet6SocketAddress const & other) - const -{ - return ::memcmp(&sockaddr_.sin6_addr, &other.sockaddr_.sin6_addr, sizeof(sockaddr_.sin6_addr))==0 && - sockaddr_.sin6_port == other.sockaddr_.sin6_port && - sockaddr_.sin6_scope_id == other.sockaddr_.sin6_scope_id; -} - -prefix_ void senf::INet6SocketAddress::clear() -{ - ::memset(&sockaddr_,0,sizeof(sockaddr_)); - sockaddr_.sin6_family = AF_INET6; -} - prefix_ std::string senf::INet6SocketAddress::iface() const { @@ -152,11 +151,35 @@ prefix_ void senf::INet6SocketAddress::assignIface(std::string const & iface) } } +prefix_ std::ostream & senf::operator<<(std::ostream & os, INet6SocketAddress const & addr) +{ + os << '[' << addr.address(); + std::string iface (addr.iface()); + if (! iface.empty()) + os << '%' << iface; + os << "]:" << addr.port(); + return os; +} + +prefix_ std::istream & senf::operator>>(std::istream & is, INet6SocketAddress & addr) +{ + std::string s; + if (!(is >> s)) + return is; + try { + addr = INet6SocketAddress(s); + } + catch (AddressException &) { + is.setstate(std::ios::failbit); + } + return is; +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ //#include "INetAddressing.mpp" - + // Local Variables: // mode: c++ // fill-column: 100