From 4e318425f198875faa2afb394ac721015367d957 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Fri, 22 May 2015 02:53:56 -0400 Subject: [PATCH] Renamed Socket::acceptConnection() to Socket::accept(). Socket::accept() now assigns an incoming connection's IP address to hostname, as well as its port to port. Explicitly labeled some functions in SecureSocket as "override". --- Jupiter/SecureSocket.cpp | 2 +- Jupiter/SecureSocket.h | 14 +++++++------- Jupiter/Socket.cpp | 17 +++++++++++++++-- Jupiter/Socket.h | 2 +- Release/Jupiter.lib | Bin 268028 -> 267928 bytes 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/Jupiter/SecureSocket.cpp b/Jupiter/SecureSocket.cpp index 11e9e2f..38d3891 100644 --- a/Jupiter/SecureSocket.cpp +++ b/Jupiter/SecureSocket.cpp @@ -67,7 +67,7 @@ Jupiter::SecureSocket::~SecureSocket() if (Jupiter::SecureSocket::SSLdata_ != nullptr) delete Jupiter::SecureSocket::SSLdata_; } -Jupiter::SecureSocket *Jupiter::SecureSocket::acceptConnection() +Jupiter::SecureSocket *Jupiter::SecureSocket::accept() { int tSock = SSL_accept(Jupiter::SecureSocket::SSLdata_->handle); if (tSock > 0) diff --git a/Jupiter/SecureSocket.h b/Jupiter/SecureSocket.h index 79f6a59..1b70828 100644 --- a/Jupiter/SecureSocket.h +++ b/Jupiter/SecureSocket.h @@ -96,7 +96,7 @@ namespace Jupiter * @param Address for client to bind to. * @return True on success, false otherwise. */ - virtual bool connectToHost(const char *hostname, unsigned short iPort, const char *clientAddress = nullptr, unsigned short clientPort = 0); + virtual bool connectToHost(const char *hostname, unsigned short iPort, const char *clientAddress = nullptr, unsigned short clientPort = 0) override; /** * @brief Interface to provide simple binding to ports. @@ -106,19 +106,19 @@ namespace Jupiter * @param andListen True if listen() should be called, false otherwise. * @return True on success, false otherwise. */ - virtual bool bindToPort(const char *hostname, unsigned short iPort, bool andListen = true); + virtual bool bindToPort(const char *hostname, unsigned short iPort, bool andListen = true) override; /** * @brief Accepts an incoming connection for the port bound to. * * @return A valid SecureSocket on success, nullptr otherwise. */ - virtual SecureSocket *acceptConnection(); + virtual SecureSocket *accept() override; /** * @brief Closes the socket. */ - virtual void closeSocket(); + virtual void closeSocket() override; /** * @brief Writes new data from the socket to the buffer, without removing it from the socket queue. @@ -127,7 +127,7 @@ namespace Jupiter * @return Number of bytes received on success, less than or equal to 0 otherwise. * Note: Refer to SSL_read() for detailed return values. */ - virtual int peek(); + virtual int peek() override; /** * @brief Writes new data from the socket to the buffer. @@ -136,7 +136,7 @@ namespace Jupiter * @return Number of bytes received on success, less than or equal to 0 otherwise. * Note: Refer to SSL_read() for detailed return values. */ - virtual int recv(); + virtual int recv() override; /** * @brief Sends data across the socket. @@ -146,7 +146,7 @@ namespace Jupiter * @return Number of bytes sent on success, less than or equal to 0 otherwise. * Note: Refer to SSL_write() for detailed return values. */ - virtual int send(const char *data, size_t datalen); + virtual int send(const char *data, size_t datalen) override; /** * @brief Initializes SSL on the socket. diff --git a/Jupiter/Socket.cpp b/Jupiter/Socket.cpp index b58440c..fca30e3 100644 --- a/Jupiter/Socket.cpp +++ b/Jupiter/Socket.cpp @@ -352,15 +352,28 @@ Jupiter::StringS Jupiter::Socket::ntop(void *ip, size_t size) } } -Jupiter::Socket *Jupiter::Socket::acceptConnection() +Jupiter::Socket *Jupiter::Socket::accept() { - SOCKET tSock = accept(Socket::data_->rawSock, 0, 0); + sockaddr addr; + int size = sizeof(addr); + SOCKET tSock = ::accept(Socket::data_->rawSock, &addr, &size); if (tSock != INVALID_SOCKET) { + char resolved[NI_MAXHOST]; + getnameinfo(&addr, size, resolved, NI_MAXHOST, 0, 0, NI_NUMERICHOST); Socket *r = new Socket(Jupiter::Socket::data_->bufflen); r->data_->rawSock = tSock; r->data_->sockType = Jupiter::Socket::data_->sockType; r->data_->sockProto = Jupiter::Socket::data_->sockProto; + r->data_->host.set(resolved); + char *end = resolved + r->data_->host.size(); + while (end != resolved) + { + if (*--end == ':') + break; + r->data_->port *= 10; + r->data_->port += static_cast(Jupiter_getBase(*end, 10)); + } return r; } return nullptr; diff --git a/Jupiter/Socket.h b/Jupiter/Socket.h index 7fcf528..bcd40ed 100644 --- a/Jupiter/Socket.h +++ b/Jupiter/Socket.h @@ -243,7 +243,7 @@ namespace Jupiter * * @return A valid Socket on success, nullptr otherwise. */ - virtual Socket *acceptConnection(); + virtual Socket *accept(); /** * @brief Sets the timeout for recv() in milliseconds. diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 00849a16cfbf275400e85562151e460c6172853f..5fc6d9ba2ec6895196da0b73a398ff996a709d04 100644 GIT binary patch delta 28170 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 URpqXq$ZDbe7!!`J7OeCC0CJrc00000