///////////////////////////////cc.p////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
-// senf::INet4Address
+// senf::INet4SocketAddress
-prefix_ senf::INet4Address::INet4Address(std::string host, unsigned port)
+prefix_ senf::INet4SocketAddress::INet4SocketAddress(std::string const & addr)
{
clear();
- /** \todo gethostbyname support */
- if (::inet_aton(host.c_str(), &addr_.sin_addr) == 0)
- throw InvalidINetAddressException();
- addr_.sin_port = htons(port);
-}
-
-prefix_ std::string senf::INet4Address::str()
- const
-{
- std::stringstream s;
- s << host() << ':' << port();
- return s.str();
-}
-
-prefix_ void senf::INet4Address::clear()
-{
- ::memset(&addr_,0,sizeof(addr_));
- addr_.sin_family = AF_INET;
-}
-
-prefix_ void senf::INet4Address::assignString(std::string address)
-{
- clear();
- unsigned i = address.find(':');
+ unsigned i = addr.find(':');
if (i == std::string::npos)
- throw InvalidINetAddressException();
- // The temporary string in the next expr is guaranteed to live
- // until end-of-statement
- if (::inet_aton(std::string(address,0,i).c_str(), &addr_.sin_addr) == 0)
- throw InvalidINetAddressException();
+ throw SyntaxException();
+ address(INet4Address::from_string(std::string(addr,0,i)));
try {
- // Replace lexical_cast with strtoul ?
- addr_.sin_port = htons(boost::lexical_cast< ::u_int16_t >(std::string(address,i+1)));
+ port(boost::lexical_cast< ::u_int16_t >(std::string(addr,i+1)));
}
catch (boost::bad_lexical_cast const &) {
- throw InvalidINetAddressException();
+ throw SyntaxException();
}
}
-///////////////////////////////////////////////////////////////////////////
-// senf::INet6Address
-
-prefix_ senf::INet6Address::INet6Address(std::string const & addr)
+prefix_ senf::INet4SocketAddress::INet4SocketAddress(INet4Address const & addr, unsigned p)
{
- if (inet_pton(AF_INET6,addr.c_str(),&addr_) <= 0)
- throw InvalidINetAddressException();
-}
-
-prefix_ senf::INet6Address::INet6Address(char const * addr)
-{
- if (inet_pton(AF_INET6,addr,&addr_) <= 0)
- throw InvalidINetAddressException();
+ clear();
+ address(addr);
+ port(p);
}
-prefix_ void senf::INet6Address::clear()
+prefix_ void senf::INet4SocketAddress::clear()
{
::memset(&addr_,0,sizeof(addr_));
-}
-
-prefix_ std::string senf::INet6Address::address()
- const
-{
- char buffer[8*5];
- BOOST_ASSERT( inet_ntop(AF_INET6, &addr_, buffer, sizeof(buffer)) );
- return std::string(buffer);
-}
-
-prefix_ bool senf::INet6Address::operator==(INet6Address const & other)
- const
-{
- return ::memcmp(&addr_,&other.addr_,sizeof(addr_))==0;
-}
-
-prefix_ bool senf::INet6Address::operator!=(INet6Address const & other)
- const
-{
- return !operator==(other);
+ addr_.sin_family = AF_INET;
}
///////////////////////////////////////////////////////////////////////////
|| inet_pton(AF_INET6, std::string(boost::begin(*token),boost::end(*token)).c_str(),
&sockaddr_.sin6_addr) <= 0
|| ++token == tokens.end())
- throw InvalidINetAddressException();
+ throw SyntaxException();
if (*token == "@") {
if (++token == tokens.end())
- throw InvalidINetAddressException();
+ throw SyntaxException();
assignIface(std::string(boost::begin(*token),boost::end(*token)));
if (++token == tokens.end()
|| *token != "]")
- throw InvalidINetAddressException();
+ throw SyntaxException();
} else if (*token != "]")
- throw InvalidINetAddressException();
+ throw SyntaxException();
if (++token == tokens.end()
|| *boost::begin(*token) != ':')
- throw InvalidINetAddressException();
+ throw SyntaxException();
try {
sockaddr_.sin6_port = htons(
boost::lexical_cast<unsigned>(std::string(boost::next(boost::begin(*token)),
boost::end(*token))));
} catch(boost::bad_lexical_cast const &) {
- throw InvalidINetAddressException();
+ throw SyntaxException();
}
if (++token != tokens.end())
- throw InvalidINetAddressException();
+ throw SyntaxException();
}
prefix_ void senf::INet6SocketAddress::assignIface(std::string const & iface)
else {
sockaddr_.sin6_scope_id = if_nametoindex(iface.c_str());
if (sockaddr_.sin6_scope_id == 0)
- throw InvalidINetAddressException();
+ throw SyntaxException();
}
}