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);