X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FProtocols%2FINet%2FINetAddressing.cc;h=fdb4ee1564da4614eabbbee8b8e2fd979adb3aca;hb=26d3a25e9afa95c1daff06878a29e45cf811d18b;hp=dd5d6e13603ce7c69a8fca67f4da6c21ea9a428e;hpb=51c2aabf6c125ff09177fc2fa742755b6c5a74c6;p=senf.git diff --git a/Socket/Protocols/INet/INetAddressing.cc b/Socket/Protocols/INet/INetAddressing.cc index dd5d6e1..fdb4ee1 100644 --- a/Socket/Protocols/INet/INetAddressing.cc +++ b/Socket/Protocols/INet/INetAddressing.cc @@ -44,31 +44,31 @@ // senf::INet4SocketAddress prefix_ senf::INet4SocketAddress::INet4SocketAddress(std::string const & addr) + : BSDSocketAddress (sizeof(sockaddr_in), AF_INET) { - clear(); - unsigned i = addr.find(':'); - if (i == std::string::npos) - throw AddressSyntaxException(); + std::string::size_type portIx = addr.find(':'); try { - port(boost::lexical_cast< ::u_int16_t >(std::string(addr,i+1))); + port( boost::lexical_cast< ::u_int16_t >(portIx == std::string::npos + ? addr : std::string(addr,portIx+1)) ); } catch (boost::bad_lexical_cast const &) { - throw AddressSyntaxException(); + throw AddressSyntaxException() << "invalid port number"; } - address(INet4Address::from_string(std::string(addr,0,i))); + if (portIx != std::string::npos) + address( INet4Address::from_string(std::string(addr,0,portIx)) ); } prefix_ senf::INet4SocketAddress::INet4SocketAddress(INet4Address const & addr, unsigned p) + : BSDSocketAddress (sizeof(sockaddr_in), AF_INET) { - clear(); address(addr); port(p); } -prefix_ void senf::INet4SocketAddress::clear() +prefix_ senf::INet4SocketAddress::INet4SocketAddress(unsigned p) + : BSDSocketAddress (sizeof(sockaddr_in), AF_INET) { - ::memset(&addr_,0,sizeof(addr_)); - addr_.sin_family = AF_INET; + port(p); } /////////////////////////////////////////////////////////////////////////// @@ -76,19 +76,19 @@ 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 - static boost::regex const addressRx ("(?:\\[([a-f0-9A-F:]+)(?:%(.+))?\\]|(.+)):([0-9]+)"); + static boost::regex const addressRx ("(?:(?:\\[([^%]+)(?:%(.+))?\\]|(.+)):)?([0-9]+)"); // Subexpression numbers: - enum { NumericAddr = 1, - ZoneId = 2, - Hostname = 3, - Port = 4 }; - + enum { Address = 1, + ZoneId = 2, + Hostname = 3, + Port = 4 }; + boost::smatch match; if (! regex_match(addr, match, addressRx)) throw AddressSyntaxException(); @@ -98,30 +98,12 @@ prefix_ senf::INet6SocketAddress::INet6SocketAddress(std::string const & addr, sockaddr_.sin6_port = htons(boost::lexical_cast(match[Port])); - INet6Address a (INet6Address::from_string( - match[NumericAddr].matched ? match[NumericAddr] : match[Hostname], - resolve)); - std::copy(a.begin(), a.end(), &sockaddr_.sin6_addr.s6_addr[0]); -} - -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_ bool senf::INet6SocketAddress::operator!=(INet6SocketAddress const & other) - const -{ - return ! operator==(other); -} - -prefix_ void senf::INet6SocketAddress::clear() -{ - ::memset(&sockaddr_,0,sizeof(sockaddr_)); - sockaddr_.sin6_family = AF_INET6; + if (match[Address].matched || match[Hostname].matched) { + INet6Address a (INet6Address::from_string( + match[Address].matched ? match[Address] : match[Hostname], + resolve)); + std::copy(a.begin(), a.end(), &sockaddr_.sin6_addr.s6_addr[0]); + } } prefix_ std::string senf::INet6SocketAddress::iface() @@ -130,7 +112,7 @@ prefix_ std::string senf::INet6SocketAddress::iface() if (sockaddr_.sin6_scope_id == 0) return ""; char buffer[IFNAMSIZ]; -#ifndef SENF_NO_DEBUG +#ifdef SENF_DEBUG SENF_ASSERT( if_indextoname(sockaddr_.sin6_scope_id,buffer) ); #else if_indextoname(sockaddr_.sin6_scope_id,buffer); @@ -153,7 +135,7 @@ prefix_ void senf::INet6SocketAddress::assignIface(std::string const & iface) #undef prefix_ //#include "INetAddressing.mpp" - + // Local Variables: // mode: c++ // fill-column: 100