(SocketServer) add ability to bind on an ipv6 address
This commit is contained in:
		| @@ -42,8 +42,8 @@ namespace | ||||
|  | ||||
| namespace ix | ||||
| { | ||||
|     HttpServer::HttpServer(int port, const std::string& host, int backlog, size_t maxConnections) | ||||
|         : SocketServer(port, host, backlog, maxConnections) | ||||
|     HttpServer::HttpServer(int port, const std::string& host, int backlog, size_t maxConnections, int addressFamily) | ||||
|         : SocketServer(port, host, backlog, maxConnections, addressFamily) | ||||
|         , _connectedClientsCount(0) | ||||
|     { | ||||
|         setDefaultConnectionCallback(); | ||||
|   | ||||
| @@ -28,7 +28,8 @@ namespace ix | ||||
|         HttpServer(int port = SocketServer::kDefaultPort, | ||||
|                    const std::string& host = SocketServer::kDefaultHost, | ||||
|                    int backlog = SocketServer::kDefaultTcpBacklog, | ||||
|                    size_t maxConnections = SocketServer::kDefaultMaxConnections); | ||||
|                    size_t maxConnections = SocketServer::kDefaultMaxConnections, | ||||
|                    int addressFamily = SocketServer::kDefaultAddressFamily); | ||||
|         virtual ~HttpServer(); | ||||
|         virtual void stop() final; | ||||
|  | ||||
|   | ||||
| @@ -21,15 +21,18 @@ namespace ix | ||||
|     const std::string SocketServer::kDefaultHost("127.0.0.1"); | ||||
|     const int SocketServer::kDefaultTcpBacklog(5); | ||||
|     const size_t SocketServer::kDefaultMaxConnections(32); | ||||
|     const int SocketServer::kDefaultAddressFamily(AF_INET); | ||||
|  | ||||
|     SocketServer::SocketServer(int port, | ||||
|                                const std::string& host, | ||||
|                                int backlog, | ||||
|                                size_t maxConnections) | ||||
|                                size_t maxConnections, | ||||
|                                int addressFamily) | ||||
|         : _port(port) | ||||
|         , _host(host) | ||||
|         , _backlog(backlog) | ||||
|         , _maxConnections(maxConnections) | ||||
|         , _addressFamily(addressFamily) | ||||
|         , _serverFd(-1) | ||||
|         , _stop(false) | ||||
|         , _stopGc(false) | ||||
| @@ -59,7 +62,7 @@ namespace ix | ||||
|         struct sockaddr_in server; // server address information | ||||
|  | ||||
|         // 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; | ||||
|             ss << "SocketServer::listen() error creating socket): " << strerror(Socket::getErrno()); | ||||
| @@ -80,17 +83,18 @@ namespace ix | ||||
|         } | ||||
|  | ||||
|         // Bind the socket to the server address. | ||||
|         server.sin_family = AF_INET; | ||||
|         server.sin_family = _addressFamily; | ||||
|         server.sin_port = htons(_port); | ||||
|  | ||||
|         // Using INADDR_ANY trigger a pop-up box as binding to any address is detected | ||||
|         // 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). | ||||
|         // | ||||
|         // Using INADDR_LOOPBACK also does not work ... while it should. | ||||
|         // We default to 127.0.0.1 (localhost) | ||||
|         // | ||||
|         server.sin_addr.s_addr = inet_addr(_host.c_str()); | ||||
|         if (inet_pton(_addressFamily, _host.c_str(), &server.sin_addr.s_addr) < 0) | ||||
|         { | ||||
|             std::stringstream ss; | ||||
|             ss << "SocketServer::listen() error calling inet_pton " | ||||
|                << "at address " << _host << ":" << _port << " : " << strerror(Socket::getErrno()); | ||||
|  | ||||
|             Socket::closeSocket(_serverFd); | ||||
|             return std::make_pair(false, ss.str()); | ||||
|         } | ||||
|  | ||||
|         if (bind(_serverFd, (struct sockaddr*) &server, sizeof(server)) < 0) | ||||
|         { | ||||
|   | ||||
| @@ -36,7 +36,8 @@ namespace ix | ||||
|         SocketServer(int port = SocketServer::kDefaultPort, | ||||
|                      const std::string& host = SocketServer::kDefaultHost, | ||||
|                      int backlog = SocketServer::kDefaultTcpBacklog, | ||||
|                      size_t maxConnections = SocketServer::kDefaultMaxConnections); | ||||
|                      size_t maxConnections = SocketServer::kDefaultMaxConnections, | ||||
|                      int addressFamily = SocketServer::kDefaultAddressFamily); | ||||
|         virtual ~SocketServer(); | ||||
|         virtual void stop(); | ||||
|  | ||||
| @@ -49,6 +50,7 @@ namespace ix | ||||
|         const static std::string kDefaultHost; | ||||
|         const static int kDefaultTcpBacklog; | ||||
|         const static size_t kDefaultMaxConnections; | ||||
|         const static int kDefaultAddressFamily; | ||||
|  | ||||
|         void start(); | ||||
|         std::pair<bool, std::string> listen(); | ||||
| @@ -69,6 +71,7 @@ namespace ix | ||||
|         std::string _host; | ||||
|         int _backlog; | ||||
|         size_t _maxConnections; | ||||
|         int _addressFamily; | ||||
|  | ||||
|         // socket for accepting connections | ||||
|         int _serverFd; | ||||
|   | ||||
| @@ -23,8 +23,9 @@ namespace ix | ||||
|                                      const std::string& host, | ||||
|                                      int backlog, | ||||
|                                      size_t maxConnections, | ||||
|                                      int handshakeTimeoutSecs) | ||||
|         : SocketServer(port, host, backlog, maxConnections) | ||||
|                                      int handshakeTimeoutSecs, | ||||
|                                      int addressFamily) | ||||
|         : SocketServer(port, host, backlog, maxConnections, addressFamily) | ||||
|         , _handshakeTimeoutSecs(handshakeTimeoutSecs) | ||||
|         , _enablePong(kDefaultEnablePong) | ||||
|     { | ||||
|   | ||||
| @@ -29,7 +29,8 @@ namespace ix | ||||
|                         const std::string& host = SocketServer::kDefaultHost, | ||||
|                         int backlog = SocketServer::kDefaultTcpBacklog, | ||||
|                         size_t maxConnections = SocketServer::kDefaultMaxConnections, | ||||
|                         int handshakeTimeoutSecs = WebSocketServer::kDefaultHandShakeTimeoutSecs); | ||||
|                         int handshakeTimeoutSecs = WebSocketServer::kDefaultHandShakeTimeoutSecs, | ||||
|                         int addressFamily = SocketServer::kDefaultAddressFamily); | ||||
|         virtual ~WebSocketServer(); | ||||
|         virtual void stop() final; | ||||
|  | ||||
|   | ||||
| @@ -6,4 +6,4 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #define IX_WEBSOCKET_VERSION "7.9.6" | ||||
| #define IX_WEBSOCKET_VERSION "7.9.7" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user