This commit is contained in:
Michael Theall 2024-01-29 21:03:40 -06:00
parent 365945d7e8
commit fd9980ffce
3 changed files with 32 additions and 32 deletions

View File

@ -57,36 +57,39 @@ public:
/// \param that_ Object to move from
SockAddr &operator= (SockAddr &&that_);
/// \param Parameterized constructor
/// \brief Parameterized constructor
/// \param addr_ Address
SockAddr (struct sockaddr_in const &addr_);
#ifndef NO_IPV6
/// \param Parameterized constructor
/// \brief Parameterized constructor
/// \param addr_ Address
SockAddr (struct sockaddr_in6 const &addr_);
#endif
/// \param Parameterized constructor
/// \brief Parameterized constructor
/// \param addr_ Address
SockAddr (struct sockaddr_storage const &addr_);
/// \param sockaddr_in cast operator
/// \brief sockaddr_in cast operator
operator struct sockaddr_in const & () const;
#ifndef NO_IPV6
/// \param sockaddr_in6 cast operator
/// \brief sockaddr_in6 cast operator
operator struct sockaddr_in6 const & () const;
#endif
/// \param sockaddr_storage cast operator
/// \brief sockaddr_storage cast operator
operator struct sockaddr_storage const & () const;
/// \param sockaddr* cast operator
/// \brief sockaddr* cast operator
operator struct sockaddr * ();
/// \param sockaddr const* cast operator
/// \brief sockaddr const* cast operator
operator struct sockaddr const * () const;
/// \brief sockaddr size
socklen_t size () const;
/// \brief Address port
std::uint16_t port () const;

View File

@ -124,6 +124,23 @@ bool SockAddr::setPort (std::uint16_t const port_)
}
}
socklen_t SockAddr::size () const
{
switch (m_addr.ss_family)
{
case AF_INET:
return sizeof (struct sockaddr_in);
#ifndef NO_IPV6
case AF_INET6:
return sizeof (struct sockaddr_in6);
#endif
default:
std::abort ();
}
}
std::uint16_t SockAddr::port () const
{
switch (m_addr.ss_family)

View File

@ -3,7 +3,7 @@
// - RFC 3659 (https://tools.ietf.org/html/rfc3659)
// - suggested implementation details from https://cr.yp.to/ftp/filesystem.html
//
// Copyright (C) 2023 Michael Theall
// Copyright (C) 2024 Michael Theall
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@ -95,30 +95,10 @@ int Socket::atMark ()
bool Socket::bind (SockAddr const &addr_)
{
switch (static_cast<struct sockaddr_storage const &> (addr_).ss_family)
if (::bind (m_fd, addr_, addr_.size ()) != 0)
{
case AF_INET:
if (::bind (m_fd, addr_, sizeof (struct sockaddr_in)) != 0)
{
error ("bind: %s\n", std::strerror (errno));
return false;
}
break;
#ifndef NO_IPV6
case AF_INET6:
if (::bind (m_fd, addr_, sizeof (struct sockaddr_in6)) != 0)
{
error ("bind: %s\n", std::strerror (errno));
return false;
}
break;
#endif
default:
errno = EINVAL;
error ("bind: %s\n", std::strerror (errno));
break;
return false;
}
if (addr_.port () == 0)
@ -136,7 +116,7 @@ bool Socket::bind (SockAddr const &addr_)
bool Socket::connect (SockAddr const &addr_)
{
if (::connect (m_fd, addr_, sizeof (struct sockaddr_storage)) != 0)
if (::connect (m_fd, addr_, addr_.size ()) != 0)
{
if (errno != EINPROGRESS)
error ("connect: %s\n", std::strerror (errno));