X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FINet%2FINetAddressing.cc;h=e224408f1bc827a32764ee78eb36985c8873681f;hb=5443435c4c2b6e4386c5334b5b8358273f2bae93;hp=ef448a869b2fb579aa8a8feac4ea0da59582df5f;hpb=1004d55779889e573ab51cf007ea5e25434165a7;p=senf.git diff --git a/Socket/Protocols/INet/INetAddressing.cc b/Socket/Protocols/INet/INetAddressing.cc index ef448a8..e224408 100644 --- a/Socket/Protocols/INet/INetAddressing.cc +++ b/Socket/Protocols/INet/INetAddressing.cc @@ -46,9 +46,9 @@ prefix_ senf::INet4SocketAddress::INet4SocketAddress(std::string const & addr) : BSDSocketAddress (sizeof(sockaddr_in), AF_INET) { - 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 &) { @@ -71,6 +71,26 @@ prefix_ senf::INet4SocketAddress::INet4SocketAddress(unsigned p) port(p); } +prefix_ std::ostream & senf::operator<<(std::ostream & os, INet4SocketAddress const & addr) +{ + 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; +} + /////////////////////////////////////////////////////////////////////////// // senf::INet6SocketAddress @@ -88,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(); @@ -131,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