IpPort getIpPortFromSockAddr(const SockAddr &sa){ const int family = sa.getFamily(); if(family == AF_INET){ if(sa.getSize() < sizeof(::sockaddr_in)){ LOG_POSEIDON_WARNING("Invalid IPv4 SockAddr: size = ", sa.getSize()); DEBUG_THROW(Exception, sslit("Invalid IPv4 SockAddr")); } char ip[INET_ADDRSTRLEN]; const char *const str = ::inet_ntop(AF_INET, &static_cast<const ::sockaddr_in *>(sa.getData())->sin_addr, ip, sizeof(ip)); if(!str){ DEBUG_THROW(SystemException); } return IpPort(SharedNts(str), loadBe(static_cast<const ::sockaddr_in *>(sa.getData())->sin_port)); } else if(family == AF_INET6){ if(sa.getSize() < sizeof(::sockaddr_in6)){ LOG_POSEIDON_WARNING("Invalid IPv6 SockAddr: size = ", sa.getSize()); DEBUG_THROW(Exception, sslit("Invalid IPv6 SockAddr")); } char ip[INET6_ADDRSTRLEN]; const char *const str = ::inet_ntop(AF_INET6, &static_cast<const ::sockaddr_in6 *>(sa.getData())->sin6_addr, ip, sizeof(ip)); if(!str){ DEBUG_THROW(SystemException); } return IpPort(SharedNts(str), loadBe(static_cast<const ::sockaddr_in6 *>(sa.getData())->sin6_port)); } LOG_POSEIDON_WARNING("Unknown IP protocol ", family); DEBUG_THROW(Exception, sslit("Unknown IP protocol")); }
static std::tuple<Socket, SocketError> getConnectedSocket(const SockAddr sockAddr) { Socket requestSocket; SocketError socketErr = requestSocket.init(sockAddr.getFamily()); if (socketErr != SocketError::Ok) { return std::make_tuple(Socket(), socketErr); } socketErr = requestSocket.connect(sockAddr); if (socketErr != SocketError::Ok) { return std::make_tuple(Socket(), socketErr); } return std::make_tuple(std::move(requestSocket), SocketError::Ok); }
// TODO: Put in common file static std::tuple<Socket, SocketError> getAcceptingSocket(const SockAddr& sockAddr) { Socket socket; SocketError err = socket.init(sockAddr.getFamily()); if (err != SocketError::Ok) { return std::make_tuple(Socket(), err); } err = socket.bind(sockAddr); if (err != SocketError::Ok) { return std::make_tuple(Socket(), err); } err = socket.listen(); if (err != SocketError::Ok) { return std::make_tuple(Socket(), err); } return std::make_tuple(std::move(socket), SocketError::Ok); }