(SocketServer) add ability to bind on an ipv6 address
This commit is contained in:
		| @@ -1,6 +1,10 @@ | |||||||
| # Changelog | # Changelog | ||||||
| All changes to this project will be documented in this file. | All changes to this project will be documented in this file. | ||||||
|  |  | ||||||
|  | ## [8.0.0] - 2020-01-26 | ||||||
|  |  | ||||||
|  | (SocketServer) add ability to bind on an ipv6 address | ||||||
|  |  | ||||||
| ## [7.9.6] - 2020-01-22 | ## [7.9.6] - 2020-01-22 | ||||||
|  |  | ||||||
| (ws) add a dnslookup sub-command, to get the ip address of a remote host | (ws) add a dnslookup sub-command, to get the ip address of a remote host | ||||||
|   | |||||||
| @@ -17,8 +17,8 @@ | |||||||
|  |  | ||||||
| namespace ix | namespace ix | ||||||
| { | { | ||||||
|     RedisServer::RedisServer(int port, const std::string& host, int backlog, size_t maxConnections) |     RedisServer::RedisServer(int port, const std::string& host, int backlog, size_t maxConnections, int addressFamily) | ||||||
|         : SocketServer(port, host, backlog, maxConnections) |         : SocketServer(port, host, backlog, maxConnections, addressFamily) | ||||||
|         , _connectedClientsCount(0) |         , _connectedClientsCount(0) | ||||||
|         , _stopHandlingConnections(false) |         , _stopHandlingConnections(false) | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -25,7 +25,8 @@ namespace ix | |||||||
|         RedisServer(int port = SocketServer::kDefaultPort, |         RedisServer(int port = SocketServer::kDefaultPort, | ||||||
|                     const std::string& host = SocketServer::kDefaultHost, |                     const std::string& host = SocketServer::kDefaultHost, | ||||||
|                     int backlog = SocketServer::kDefaultTcpBacklog, |                     int backlog = SocketServer::kDefaultTcpBacklog, | ||||||
|                     size_t maxConnections = SocketServer::kDefaultMaxConnections); |                     size_t maxConnections = SocketServer::kDefaultMaxConnections, | ||||||
|  |                     int addressFamily = SocketServer::kDefaultAddressFamily); | ||||||
|         virtual ~RedisServer(); |         virtual ~RedisServer(); | ||||||
|         virtual void stop() final; |         virtual void stop() final; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -42,8 +42,8 @@ namespace | |||||||
|  |  | ||||||
| namespace ix | namespace ix | ||||||
| { | { | ||||||
|     HttpServer::HttpServer(int port, const std::string& host, int backlog, size_t maxConnections) |     HttpServer::HttpServer(int port, const std::string& host, int backlog, size_t maxConnections, int addressFamily) | ||||||
|         : SocketServer(port, host, backlog, maxConnections) |         : SocketServer(port, host, backlog, maxConnections, addressFamily) | ||||||
|         , _connectedClientsCount(0) |         , _connectedClientsCount(0) | ||||||
|     { |     { | ||||||
|         setDefaultConnectionCallback(); |         setDefaultConnectionCallback(); | ||||||
|   | |||||||
| @@ -28,7 +28,8 @@ namespace ix | |||||||
|         HttpServer(int port = SocketServer::kDefaultPort, |         HttpServer(int port = SocketServer::kDefaultPort, | ||||||
|                    const std::string& host = SocketServer::kDefaultHost, |                    const std::string& host = SocketServer::kDefaultHost, | ||||||
|                    int backlog = SocketServer::kDefaultTcpBacklog, |                    int backlog = SocketServer::kDefaultTcpBacklog, | ||||||
|                    size_t maxConnections = SocketServer::kDefaultMaxConnections); |                    size_t maxConnections = SocketServer::kDefaultMaxConnections, | ||||||
|  |                    int addressFamily = SocketServer::kDefaultAddressFamily); | ||||||
|         virtual ~HttpServer(); |         virtual ~HttpServer(); | ||||||
|         virtual void stop() final; |         virtual void stop() final; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -21,15 +21,18 @@ namespace ix | |||||||
|     const std::string SocketServer::kDefaultHost("127.0.0.1"); |     const std::string SocketServer::kDefaultHost("127.0.0.1"); | ||||||
|     const int SocketServer::kDefaultTcpBacklog(5); |     const int SocketServer::kDefaultTcpBacklog(5); | ||||||
|     const size_t SocketServer::kDefaultMaxConnections(32); |     const size_t SocketServer::kDefaultMaxConnections(32); | ||||||
|  |     const int SocketServer::kDefaultAddressFamily(AF_INET); | ||||||
|  |  | ||||||
|     SocketServer::SocketServer(int port, |     SocketServer::SocketServer(int port, | ||||||
|                                const std::string& host, |                                const std::string& host, | ||||||
|                                int backlog, |                                int backlog, | ||||||
|                                size_t maxConnections) |                                size_t maxConnections, | ||||||
|  |                                int addressFamily) | ||||||
|         : _port(port) |         : _port(port) | ||||||
|         , _host(host) |         , _host(host) | ||||||
|         , _backlog(backlog) |         , _backlog(backlog) | ||||||
|         , _maxConnections(maxConnections) |         , _maxConnections(maxConnections) | ||||||
|  |         , _addressFamily(addressFamily) | ||||||
|         , _serverFd(-1) |         , _serverFd(-1) | ||||||
|         , _stop(false) |         , _stop(false) | ||||||
|         , _stopGc(false) |         , _stopGc(false) | ||||||
| @@ -59,7 +62,7 @@ namespace ix | |||||||
|         struct sockaddr_in server; // server address information |         struct sockaddr_in server; // server address information | ||||||
|  |  | ||||||
|         // Get a socket for accepting connections. |         // Get a socket for accepting connections. | ||||||
|         if ((_serverFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) |         if ((_serverFd = socket(_addressFamily, SOCK_STREAM, 0)) < 0) | ||||||
|         { |         { | ||||||
|             std::stringstream ss; |             std::stringstream ss; | ||||||
|             ss << "SocketServer::listen() error creating socket): " << strerror(Socket::getErrno()); |             ss << "SocketServer::listen() error creating socket): " << strerror(Socket::getErrno()); | ||||||
| @@ -80,17 +83,18 @@ namespace ix | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Bind the socket to the server address. |         // Bind the socket to the server address. | ||||||
|         server.sin_family = AF_INET; |         server.sin_family = _addressFamily; | ||||||
|         server.sin_port = htons(_port); |         server.sin_port = htons(_port); | ||||||
|  |  | ||||||
|         // Using INADDR_ANY trigger a pop-up box as binding to any address is detected |         if (inet_pton(_addressFamily, _host.c_str(), &server.sin_addr.s_addr) < 0) | ||||||
|         // by the osx firewall. We need to codesign the binary with a self-signed cert |         { | ||||||
|         // to allow that, but this is a bit of a pain. (this is what node or python would do). |             std::stringstream ss; | ||||||
|         // |             ss << "SocketServer::listen() error calling inet_pton " | ||||||
|         // Using INADDR_LOOPBACK also does not work ... while it should. |                << "at address " << _host << ":" << _port << " : " << strerror(Socket::getErrno()); | ||||||
|         // We default to 127.0.0.1 (localhost) |  | ||||||
|         // |             Socket::closeSocket(_serverFd); | ||||||
|         server.sin_addr.s_addr = inet_addr(_host.c_str()); |             return std::make_pair(false, ss.str()); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (bind(_serverFd, (struct sockaddr*) &server, sizeof(server)) < 0) |         if (bind(_serverFd, (struct sockaddr*) &server, sizeof(server)) < 0) | ||||||
|         { |         { | ||||||
|   | |||||||
| @@ -36,7 +36,8 @@ namespace ix | |||||||
|         SocketServer(int port = SocketServer::kDefaultPort, |         SocketServer(int port = SocketServer::kDefaultPort, | ||||||
|                      const std::string& host = SocketServer::kDefaultHost, |                      const std::string& host = SocketServer::kDefaultHost, | ||||||
|                      int backlog = SocketServer::kDefaultTcpBacklog, |                      int backlog = SocketServer::kDefaultTcpBacklog, | ||||||
|                      size_t maxConnections = SocketServer::kDefaultMaxConnections); |                      size_t maxConnections = SocketServer::kDefaultMaxConnections, | ||||||
|  |                      int addressFamily = SocketServer::kDefaultAddressFamily); | ||||||
|         virtual ~SocketServer(); |         virtual ~SocketServer(); | ||||||
|         virtual void stop(); |         virtual void stop(); | ||||||
|  |  | ||||||
| @@ -49,6 +50,7 @@ namespace ix | |||||||
|         const static std::string kDefaultHost; |         const static std::string kDefaultHost; | ||||||
|         const static int kDefaultTcpBacklog; |         const static int kDefaultTcpBacklog; | ||||||
|         const static size_t kDefaultMaxConnections; |         const static size_t kDefaultMaxConnections; | ||||||
|  |         const static int kDefaultAddressFamily; | ||||||
|  |  | ||||||
|         void start(); |         void start(); | ||||||
|         std::pair<bool, std::string> listen(); |         std::pair<bool, std::string> listen(); | ||||||
| @@ -69,6 +71,7 @@ namespace ix | |||||||
|         std::string _host; |         std::string _host; | ||||||
|         int _backlog; |         int _backlog; | ||||||
|         size_t _maxConnections; |         size_t _maxConnections; | ||||||
|  |         int _addressFamily; | ||||||
|  |  | ||||||
|         // socket for accepting connections |         // socket for accepting connections | ||||||
|         int _serverFd; |         int _serverFd; | ||||||
|   | |||||||
| @@ -23,8 +23,9 @@ namespace ix | |||||||
|                                      const std::string& host, |                                      const std::string& host, | ||||||
|                                      int backlog, |                                      int backlog, | ||||||
|                                      size_t maxConnections, |                                      size_t maxConnections, | ||||||
|                                      int handshakeTimeoutSecs) |                                      int handshakeTimeoutSecs, | ||||||
|         : SocketServer(port, host, backlog, maxConnections) |                                      int addressFamily) | ||||||
|  |         : SocketServer(port, host, backlog, maxConnections, addressFamily) | ||||||
|         , _handshakeTimeoutSecs(handshakeTimeoutSecs) |         , _handshakeTimeoutSecs(handshakeTimeoutSecs) | ||||||
|         , _enablePong(kDefaultEnablePong) |         , _enablePong(kDefaultEnablePong) | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -29,7 +29,8 @@ namespace ix | |||||||
|                         const std::string& host = SocketServer::kDefaultHost, |                         const std::string& host = SocketServer::kDefaultHost, | ||||||
|                         int backlog = SocketServer::kDefaultTcpBacklog, |                         int backlog = SocketServer::kDefaultTcpBacklog, | ||||||
|                         size_t maxConnections = SocketServer::kDefaultMaxConnections, |                         size_t maxConnections = SocketServer::kDefaultMaxConnections, | ||||||
|                         int handshakeTimeoutSecs = WebSocketServer::kDefaultHandShakeTimeoutSecs); |                         int handshakeTimeoutSecs = WebSocketServer::kDefaultHandShakeTimeoutSecs, | ||||||
|  |                         int addressFamily = SocketServer::kDefaultAddressFamily); | ||||||
|         virtual ~WebSocketServer(); |         virtual ~WebSocketServer(); | ||||||
|         virtual void stop() final; |         virtual void stop() final; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,4 +6,4 @@ | |||||||
|  |  | ||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #define IX_WEBSOCKET_VERSION "7.9.6" | #define IX_WEBSOCKET_VERSION "7.9.7" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user