diff --git a/src/logic/scripting/lua/libs/libnetwork.cpp b/src/logic/scripting/lua/libs/libnetwork.cpp index a2b49cc1..a2d48b5b 100644 --- a/src/logic/scripting/lua/libs/libnetwork.cpp +++ b/src/logic/scripting/lua/libs/libnetwork.cpp @@ -159,9 +159,19 @@ static int l_is_serveropen(lua::State* L) { return lua::pushboolean(L, false); } +static int l_get_total_upload(lua::State* L) { + return lua::pushinteger(L, engine->getNetwork().getTotalUpload()); +} + +static int l_get_total_download(lua::State* L) { + return lua::pushinteger(L, engine->getNetwork().getTotalDownload()); +} + const luaL_Reg networklib[] = { {"get", lua::wrap}, {"get_binary", lua::wrap}, + {"get_total_upload", lua::wrap}, + {"get_total_download", lua::wrap}, {"__open", lua::wrap}, {"__closeserver", lua::wrap}, {"__connect", lua::wrap}, diff --git a/src/network/Network.cpp b/src/network/Network.cpp index 15e7bdc2..f0ebd3ca 100644 --- a/src/network/Network.cpp +++ b/src/network/Network.cpp @@ -367,12 +367,16 @@ public: } } - size_t getTotalUpload() const override { - return totalUpload; + size_t pullUpload() override { + size_t size = totalUpload; + totalUpload = 0; + return size; } - size_t getTotalDownload() const override { - return totalDownload; + size_t pullDownload() override { + size_t size = totalDownload; + totalDownload = 0; + return size; } static std::shared_ptr connect( @@ -586,15 +590,28 @@ size_t Network::getTotalDownload() const { void Network::update() { requests->update(); - totalDownload = 0; - totalUpload = 0; { std::lock_guard lock(connectionsMutex); - for (const auto& [_, socket] : connections) { - totalDownload += socket->getTotalDownload(); + auto socketiter = connections.begin(); + while (socketiter != connections.end()) { + auto socket = socketiter->second.get(); + totalDownload += socket->pullDownload(); + totalUpload += socket->pullUpload(); + if (socket->available() == 0 && + socket->getState() == ConnectionState::CLOSED) { + socketiter = connections.erase(socketiter); + continue; + } + ++socketiter; } - for (const auto& [_, socket] : connections) { - totalUpload += socket->getTotalUpload(); + auto serveriter = servers.begin(); + while (serveriter != servers.end()) { + auto server = serveriter->second.get(); + if (!server->isOpen()) { + serveriter = servers.erase(serveriter); + continue; + } + ++serveriter; } } } diff --git a/src/network/Network.hpp b/src/network/Network.hpp index a6ccb864..756784f4 100644 --- a/src/network/Network.hpp +++ b/src/network/Network.hpp @@ -43,8 +43,8 @@ namespace network { virtual void close() = 0; virtual int available() = 0; - virtual size_t getTotalUpload() const = 0; - virtual size_t getTotalDownload() const = 0; + virtual size_t pullUpload() = 0; + virtual size_t pullDownload() = 0; virtual ConnectionState getState() const = 0; };