From 3c76d2aa8e117bbff537a60bd55780369cc3e1a8 Mon Sep 17 00:00:00 2001 From: Ollie Walsh Date: Thu, 19 Feb 2026 00:10:21 +0000 Subject: [PATCH] Add optional bind_ip to Io::start --- libxbot-service/include/xbot-service/Io.hpp | 2 +- .../include/xbot-service/portable/socket.hpp | 3 ++- libxbot-service/src/portable/linux/Io.cpp | 4 ++-- libxbot-service/src/portable/linux/socket.cpp | 20 +++++++++---------- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/libxbot-service/include/xbot-service/Io.hpp b/libxbot-service/include/xbot-service/Io.hpp index 32c4e82..b51be13 100644 --- a/libxbot-service/include/xbot-service/Io.hpp +++ b/libxbot-service/include/xbot-service/Io.hpp @@ -17,7 +17,7 @@ class Io { static bool getEndpoint(char* ip, size_t ip_len, uint16_t* port); - static bool start(); + static bool start(const char* bind_ip="0.0.0.0"); }; } // namespace xbot::service diff --git a/libxbot-service/include/xbot-service/portable/socket.hpp b/libxbot-service/include/xbot-service/portable/socket.hpp index c6c143e..dbc7680 100644 --- a/libxbot-service/include/xbot-service/portable/socket.hpp +++ b/libxbot-service/include/xbot-service/portable/socket.hpp @@ -19,9 +19,10 @@ typedef XBOT_SOCKET_TYPEDEF* SocketPtr; /** * Creates a socket and returns the pointer to it * @param bind_multicast: true to prepare the socket for listening + * @param bind_address: the IP address to bind the socket to (default 0.0.0.0) * @return The created socket */ -bool initialize(SocketPtr socket, bool bind_multicast); +bool initialize(SocketPtr socket, bool bind_multicast, const char* bind_address="0.0.0.0"); /** * Frees all socket resources diff --git a/libxbot-service/src/portable/linux/Io.cpp b/libxbot-service/src/portable/linux/Io.cpp index 4d85010..b272c26 100644 --- a/libxbot-service/src/portable/linux/Io.cpp +++ b/libxbot-service/src/portable/linux/Io.cpp @@ -97,8 +97,8 @@ bool Io::getEndpoint(char* ip, size_t ip_len, uint16_t* port) { return sock::getEndpoint(&udp_socket_, ip, ip_len, port); } -bool Io::start() { - if (!sock::initialize(&udp_socket_, false)) { +bool Io::start(const char* bind_ip) { + if (!sock::initialize(&udp_socket_, false, bind_ip)) { return false; } return thread::initialize(&io_thread_, runIo, nullptr, nullptr, 0, IO_THD_NAME); diff --git a/libxbot-service/src/portable/linux/socket.cpp b/libxbot-service/src/portable/linux/socket.cpp index c84fa00..25c6a0f 100644 --- a/libxbot-service/src/portable/linux/socket.cpp +++ b/libxbot-service/src/portable/linux/socket.cpp @@ -67,7 +67,7 @@ bool get_ip(char* ip, size_t ip_len) { return success; } -bool xbot::service::sock::initialize(SocketPtr socket_ptr, bool bind_multicast) { +bool xbot::service::sock::initialize(SocketPtr socket_ptr, bool bind_multicast, const char* bind_ip) { *socket_ptr = -1; // Create a UDP socket @@ -87,6 +87,11 @@ bool xbot::service::sock::initialize(SocketPtr socket_ptr, bool bind_multicast) } } + + sockaddr_in saddr{}; + saddr.sin_family = AF_INET; + saddr.sin_addr.s_addr = inet_addr(bind_ip); + if (bind_multicast) { // Allow multiple binaries listening on the same socket. { @@ -108,17 +113,12 @@ bool xbot::service::sock::initialize(SocketPtr socket_ptr, bool bind_multicast) return false; } } - - sockaddr_in saddr{}; - saddr.sin_family = AF_INET; - saddr.sin_addr.s_addr = INADDR_ANY; saddr.sin_port = htons(config::multicast_port); + } - // Bind to any address (i.e. 0.0.0.0:port) - if (bind(fd, reinterpret_cast(&saddr), sizeof(saddr)) < 0) { - close(fd); - return false; - } + if (bind(fd, reinterpret_cast(&saddr), sizeof(saddr)) < 0) { + close(fd); + return false; } // Create a pointer to the fd and return it.