diff --git a/src/network/TcpSocket.cpp b/src/network/TcpSocket.cpp index 4d470ac262..090df63b6e 100644 --- a/src/network/TcpSocket.cpp +++ b/src/network/TcpSocket.cpp @@ -87,6 +87,8 @@ private: uint16 _listeningPort = 0; SOCKET _socket = INVALID_SOCKET; + std::string _hostName; + SDL_mutex * _connectMutex = nullptr; std::string _error; @@ -182,9 +184,11 @@ public: { throw Exception("Socket not listening."); } + struct sockaddr_storage client_addr; + socklen_t client_len = sizeof(struct sockaddr_storage); ITcpSocket * tcpSocket = nullptr; - SOCKET socket = accept(_socket, nullptr, nullptr); + SOCKET socket = accept(_socket, (struct sockaddr *)&client_addr, &client_len); if (socket == INVALID_SOCKET) { if (LAST_SOCKET_ERROR() != EWOULDBLOCK) @@ -201,8 +205,21 @@ public: } else { + char hostName[NI_MAXHOST]; + int rc = getnameinfo( + (struct sockaddr *)&client_addr, + client_len, + hostName, + sizeof(hostName), + nullptr, + 0, + NI_NUMERICHOST | NI_NUMERICSERV); SetTCPNoDelay(socket, true); tcpSocket = new TcpSocket(socket); + if (rc == 0) + { + _hostName = std::string(hostName); + } } } return tcpSocket; @@ -403,6 +420,11 @@ public: SDL_UnlockMutex(_connectMutex); } + const char * GetHostName() const override + { + return _hostName.empty() ? nullptr : _hostName.c_str(); + } + private: TcpSocket(SOCKET socket) { diff --git a/src/network/TcpSocket.h b/src/network/TcpSocket.h index 3e248951fa..1e7f9e0320 100644 --- a/src/network/TcpSocket.h +++ b/src/network/TcpSocket.h @@ -45,6 +45,7 @@ public: virtual SOCKET_STATUS GetStatus() abstract; virtual const char * GetError() abstract; + virtual const char * GetHostName() const abstract; virtual void Listen(uint16 port) abstract; virtual void Listen(const char * address, uint16 port) abstract;