From 5d4bb90703f559f547ba20fee432bc4b53d57f84 Mon Sep 17 00:00:00 2001 From: Benjamin Sergeant Date: Sun, 26 Jan 2020 16:17:26 -0800 Subject: [PATCH] (SocketServer) add ability to bind on an ipv6 address --- docs/CHANGELOG.md | 4 ++++ ixsnake/ixsnake/IXRedisServer.cpp | 4 ++-- ixsnake/ixsnake/IXRedisServer.h | 3 ++- ixwebsocket/IXHttpServer.cpp | 4 ++-- ixwebsocket/IXHttpServer.h | 3 ++- ixwebsocket/IXSocketServer.cpp | 26 +++++++++++++++----------- ixwebsocket/IXSocketServer.h | 5 ++++- ixwebsocket/IXWebSocketServer.cpp | 5 +++-- ixwebsocket/IXWebSocketServer.h | 3 ++- ixwebsocket/IXWebSocketVersion.h | 2 +- 10 files changed, 37 insertions(+), 22 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 7fd3441b..49ed05be 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,10 @@ # Changelog 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 (ws) add a dnslookup sub-command, to get the ip address of a remote host diff --git a/ixsnake/ixsnake/IXRedisServer.cpp b/ixsnake/ixsnake/IXRedisServer.cpp index a096d1be..9cf3713d 100644 --- a/ixsnake/ixsnake/IXRedisServer.cpp +++ b/ixsnake/ixsnake/IXRedisServer.cpp @@ -17,8 +17,8 @@ namespace ix { - RedisServer::RedisServer(int port, const std::string& host, int backlog, size_t maxConnections) - : SocketServer(port, host, backlog, maxConnections) + RedisServer::RedisServer(int port, const std::string& host, int backlog, size_t maxConnections, int addressFamily) + : SocketServer(port, host, backlog, maxConnections, addressFamily) , _connectedClientsCount(0) , _stopHandlingConnections(false) { diff --git a/ixsnake/ixsnake/IXRedisServer.h b/ixsnake/ixsnake/IXRedisServer.h index f410133b..d6279fd6 100644 --- a/ixsnake/ixsnake/IXRedisServer.h +++ b/ixsnake/ixsnake/IXRedisServer.h @@ -25,7 +25,8 @@ namespace ix RedisServer(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 ~RedisServer(); virtual void stop() final; diff --git a/ixwebsocket/IXHttpServer.cpp b/ixwebsocket/IXHttpServer.cpp index 123a217d..1341353f 100644 --- a/ixwebsocket/IXHttpServer.cpp +++ b/ixwebsocket/IXHttpServer.cpp @@ -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(); diff --git a/ixwebsocket/IXHttpServer.h b/ixwebsocket/IXHttpServer.h index 5779d77f..b87f8a41 100644 --- a/ixwebsocket/IXHttpServer.h +++ b/ixwebsocket/IXHttpServer.h @@ -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; diff --git a/ixwebsocket/IXSocketServer.cpp b/ixwebsocket/IXSocketServer.cpp index 300700cc..76b0b4eb 100644 --- a/ixwebsocket/IXSocketServer.cpp +++ b/ixwebsocket/IXSocketServer.cpp @@ -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) { diff --git a/ixwebsocket/IXSocketServer.h b/ixwebsocket/IXSocketServer.h index ca5d529e..535f34b7 100644 --- a/ixwebsocket/IXSocketServer.h +++ b/ixwebsocket/IXSocketServer.h @@ -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 listen(); @@ -69,6 +71,7 @@ namespace ix std::string _host; int _backlog; size_t _maxConnections; + int _addressFamily; // socket for accepting connections int _serverFd; diff --git a/ixwebsocket/IXWebSocketServer.cpp b/ixwebsocket/IXWebSocketServer.cpp index 55300d1b..409ed277 100644 --- a/ixwebsocket/IXWebSocketServer.cpp +++ b/ixwebsocket/IXWebSocketServer.cpp @@ -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) { diff --git a/ixwebsocket/IXWebSocketServer.h b/ixwebsocket/IXWebSocketServer.h index 21921672..fb2aa4be 100644 --- a/ixwebsocket/IXWebSocketServer.h +++ b/ixwebsocket/IXWebSocketServer.h @@ -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; diff --git a/ixwebsocket/IXWebSocketVersion.h b/ixwebsocket/IXWebSocketVersion.h index 842ae2ac..a2dd5852 100644 --- a/ixwebsocket/IXWebSocketVersion.h +++ b/ixwebsocket/IXWebSocketVersion.h @@ -6,4 +6,4 @@ #pragma once -#define IX_WEBSOCKET_VERSION "7.9.6" +#define IX_WEBSOCKET_VERSION "7.9.7"