diff --git a/src/utils/Socket.cpp b/src/utils/Socket.cpp index fec9e2ee81de22232eb7663fa85110231ceab551..503dac1831832fe4887277f24337c88fb3e49e49 100644 --- a/src/utils/Socket.cpp +++ b/src/utils/Socket.cpp @@ -55,6 +55,12 @@ class Socket::Internals return m_is_server_socket; } + int + portNumber() const + { + return ::ntohs(m_address.sin_port); + } + int fileDescriptor() const { @@ -83,6 +89,12 @@ operator<<(std::ostream& os, const Socket& socket) return os << *socket.m_internals; } +int +Socket::portNumber() const +{ + return m_internals->portNumber(); +} + Socket createServerSocket(int port_number) { @@ -101,8 +113,14 @@ createServerSocket(int port_number) int on = 1; ::setsockopt(socket_internals.m_socket_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); - if (::bind(socket_internals.m_socket_fd, reinterpret_cast<sockaddr*>(&socket_internals.m_address), - sizeof(socket_internals.m_address)) < 0) { + socklen_t length = sizeof(socket_internals.m_address); + + if (::bind(socket_internals.m_socket_fd, reinterpret_cast<sockaddr*>(&socket_internals.m_address), length) < 0) { + throw NormalError(strerror(errno)); + } + + if (::getsockname(socket_internals.m_socket_fd, reinterpret_cast<sockaddr*>(&socket_internals.m_address), &length) == + -1) { throw NormalError(strerror(errno)); } diff --git a/src/utils/Socket.hpp b/src/utils/Socket.hpp index b8ee7201de755cea95b47a2b6db90f127cfeab4c..6b47fa4f01d84a7782fd310bb38e78f1c4f85c6e 100644 --- a/src/utils/Socket.hpp +++ b/src/utils/Socket.hpp @@ -19,6 +19,8 @@ class Socket void _read(char* data, const size_t lenght) const; public: + int portNumber() const; + friend std::ostream& operator<<(std::ostream& os, const Socket& s); friend Socket createServerSocket(int port_number);