From 21c76c1b0d9d6d2eaaf724816a1d3475a0c0368c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 30 Nov 2024 22:32:14 +0300 Subject: [PATCH] add socket:get_address, serversocket:get_port --- doc/en/scripting/builtins/libnetwork.md | 6 ++++ doc/ru/scripting/builtins/libnetwork.md | 6 ++++ res/scripts/classes.lua | 2 ++ src/logic/scripting/lua/libs/libnetwork.cpp | 20 +++++++++++ src/network/Network.cpp | 40 ++++++++++++++------- src/network/Network.hpp | 4 +++ 6 files changed, 66 insertions(+), 12 deletions(-) diff --git a/doc/en/scripting/builtins/libnetwork.md b/doc/en/scripting/builtins/libnetwork.md index 1e519d9d..8f4b01eb 100644 --- a/doc/en/scripting/builtins/libnetwork.md +++ b/doc/en/scripting/builtins/libnetwork.md @@ -59,6 +59,9 @@ socket:is_alive() --> bool -- Checks if the connection is present (using socket:send(...) is available). socket:is_connected() --> bool + +-- Returns the address and port of the connection. +socket:get_address() --> str, int ``` ```lua @@ -80,6 +83,9 @@ server:close() -- Checks if the TCP server exists and is open. server:is_open() --> bool + +-- Returns the server port. +server:get_port() --> int ``` ## Analytics diff --git a/doc/ru/scripting/builtins/libnetwork.md b/doc/ru/scripting/builtins/libnetwork.md index 8a937330..a2304ed9 100644 --- a/doc/ru/scripting/builtins/libnetwork.md +++ b/doc/ru/scripting/builtins/libnetwork.md @@ -59,6 +59,9 @@ socket:is_alive() --> bool -- Проверяет наличие соединения (доступно использование socket:send(...)). socket:is_connected() --> bool + +-- Возвращает адрес и порт соединения. +socket:get_address() --> str, int ``` ```lua @@ -80,6 +83,9 @@ server:close() -- Проверяет, существует и открыт ли TCP сервер. server:is_open() --> bool + +-- Возвращает порт сервера. +server:get_port() --> int ``` ## Аналитика diff --git a/res/scripts/classes.lua b/res/scripts/classes.lua index 200f305f..909717cf 100644 --- a/res/scripts/classes.lua +++ b/res/scripts/classes.lua @@ -42,6 +42,7 @@ local Socket = {__index={ close=function(self) return network.__close(self.id) end, is_alive=function(self) return network.__is_alive(self.id) end, is_connected=function(self) return network.__is_connected(self.id) end, + get_address=function(self) return network.__get_address(self.id) end, }} network.tcp_connect = function(address, port, callback) @@ -55,6 +56,7 @@ end local ServerSocket = {__index={ close=function(self) return network.__closeserver(self.id) end, is_open=function(self) return network.__is_serveropen(self.id) end, + get_port=function(self) return network.__get_serverport(self.id) end, }} network.tcp_open = function(port, handler) diff --git a/src/logic/scripting/lua/libs/libnetwork.cpp b/src/logic/scripting/lua/libs/libnetwork.cpp index 7f503c23..cce00067 100644 --- a/src/logic/scripting/lua/libs/libnetwork.cpp +++ b/src/logic/scripting/lua/libs/libnetwork.cpp @@ -151,6 +151,16 @@ static int l_is_connected(lua::State* L) { return lua::pushboolean(L, false); } +static int l_get_address(lua::State* L) { + u64id_t id = lua::tointeger(L, 1); + if (auto connection = engine->getNetwork().getConnection(id)) { + lua::pushstring(L, connection->getAddress()); + lua::pushinteger(L, connection->getPort()); + return 2; + } + return 0; +} + static int l_is_serveropen(lua::State* L) { u64id_t id = lua::tointeger(L, 1); if (auto server = engine->getNetwork().getServer(id)) { @@ -159,6 +169,14 @@ static int l_is_serveropen(lua::State* L) { return lua::pushboolean(L, false); } +static int l_get_serverport(lua::State* L) { + u64id_t id = lua::tointeger(L, 1); + if (auto server = engine->getNetwork().getServer(id)) { + return lua::pushinteger(L, server->getPort()); + } + return 0; +} + static int l_get_total_upload(lua::State* L) { return lua::pushinteger(L, engine->getNetwork().getTotalUpload()); } @@ -180,6 +198,8 @@ const luaL_Reg networklib[] = { {"__recv", lua::wrap}, {"__is_alive", lua::wrap}, {"__is_connected", lua::wrap}, + {"__get_address", lua::wrap}, {"__is_serveropen", lua::wrap}, + {"__get_serverport", lua::wrap}, {NULL, NULL} }; diff --git a/src/network/Network.cpp b/src/network/Network.cpp index 5a1931ac..5036d65a 100644 --- a/src/network/Network.cpp +++ b/src/network/Network.cpp @@ -244,10 +244,11 @@ static inline int sendsocket( return send(descriptor, buf, len, flags); } -static std::string to_string(const sockaddr_in* addr) { +static std::string to_string(const sockaddr_in& addr, bool port=true) { char ip[INET_ADDRSTRLEN]; - if (inet_ntop(AF_INET, &(addr->sin_addr), ip, INET_ADDRSTRLEN)) { - return std::string(ip)+":"+std::to_string(htons(addr->sin_port)); + if (inet_ntop(AF_INET, &(addr.sin_addr), ip, INET_ADDRSTRLEN)) { + return std::string(ip) + + (port ? (":" + std::to_string(htons(addr.sin_port))) : ""); } return ""; } @@ -266,7 +267,7 @@ class SocketConnection : public Connection { void connectSocket() { state = ConnectionState::CONNECTING; - logger.info() << "connecting to " << to_string(&addr); + logger.info() << "connecting to " << to_string(addr); int res = connectsocket(descriptor, (const sockaddr*)&addr, sizeof(sockaddr_in)); if (res < 0) { auto error = handle_socket_error("Connect failed"); @@ -275,7 +276,7 @@ class SocketConnection : public Connection { logger.error() << error.what(); return; } - logger.info() << "connected to " << to_string(&addr); + logger.info() << "connected to " << to_string(addr); state = ConnectionState::CONNECTED; } public: @@ -301,13 +302,13 @@ public: while (state == ConnectionState::CONNECTED) { int size = recvsocket(descriptor, buffer.data(), buffer.size()); if (size == 0) { - logger.info() << "closed connection with " << to_string(&addr); + logger.info() << "closed connection with " << to_string(addr); closesocket(descriptor); state = ConnectionState::CLOSED; break; } else if (size < 0) { logger.info() << "an error ocurred while receiving from " - << to_string(&addr); + << to_string(addr); auto error = handle_socket_error("recv(...) error"); closesocket(descriptor); state = ConnectionState::CLOSED; @@ -321,7 +322,7 @@ public: } totalDownload += size; } - logger.info() << "read " << size << " bytes from " << to_string(&addr); + logger.info() << "read " << size << " bytes from " << to_string(addr); } }); } @@ -380,6 +381,14 @@ public: return size; } + int getPort() const override { + return htons(addr.sin_port); + } + + std::string getAddress() const override { + return to_string(addr, false); + } + static std::shared_ptr connect( const std::string& address, int port, runnable callback ) { @@ -421,9 +430,10 @@ class SocketTcpSServer : public TcpServer { std::mutex clientsMutex; bool open = true; std::unique_ptr thread = nullptr; + int port; public: - SocketTcpSServer(Network* network, SOCKET descriptor) - : network(network), descriptor(descriptor) {} + SocketTcpSServer(Network* network, SOCKET descriptor, int port) + : network(network), descriptor(descriptor), port(port) {} ~SocketTcpSServer() { closeSocket(); @@ -445,7 +455,7 @@ public: close(); break; } - logger.info() << "client connected: " << to_string(&address); + logger.info() << "client connected: " << to_string(address); auto socket = std::make_shared( clientDescriptor, address ); @@ -488,6 +498,11 @@ public: bool isOpen() override { return open; } + + int getPort() const override { + return port; + } + static std::shared_ptr openServer( Network* network, int port, consumer handler ) { @@ -515,7 +530,8 @@ public: throw std::runtime_error("could not bind port "+std::to_string(port)); } logger.info() << "opened server at port " << port; - auto server = std::make_shared(network, descriptor); + auto server = + std::make_shared(network, descriptor, port); server->startListen(std::move(handler)); return server; } diff --git a/src/network/Network.hpp b/src/network/Network.hpp index 756784f4..c6170f39 100644 --- a/src/network/Network.hpp +++ b/src/network/Network.hpp @@ -46,6 +46,9 @@ namespace network { virtual size_t pullUpload() = 0; virtual size_t pullDownload() = 0; + virtual int getPort() const = 0; + virtual std::string getAddress() const = 0; + virtual ConnectionState getState() const = 0; }; @@ -55,6 +58,7 @@ namespace network { virtual void startListen(consumer handler) = 0; virtual void close() = 0; virtual bool isOpen() = 0; + virtual int getPort() const = 0; }; class Network {