mirror of
https://github.com/BeamMP/BeamMP-Server.git
synced 2025-08-16 16:26:26 +00:00
Merge branch 'fix-little-issues' into minor
This commit is contained in:
commit
e1aaaf5e63
@ -29,6 +29,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <shared_mutex>
|
#include <shared_mutex>
|
||||||
|
#include <span>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
@ -262,57 +263,8 @@ void RegisterThread(const std::string& str);
|
|||||||
|
|
||||||
void LogChatMessage(const std::string& name, int id, const std::string& msg);
|
void LogChatMessage(const std::string& name, int id, const std::string& msg);
|
||||||
|
|
||||||
#define Biggest 30000
|
std::vector<uint8_t> Comp(std::span<const uint8_t> input);
|
||||||
|
std::vector<uint8_t> DeComp(std::span<const uint8_t> input);
|
||||||
template <typename T>
|
|
||||||
inline T Comp(const T& Data) {
|
|
||||||
std::array<char, Biggest> C {};
|
|
||||||
// obsolete
|
|
||||||
C.fill(0);
|
|
||||||
z_stream defstream;
|
|
||||||
defstream.zalloc = nullptr;
|
|
||||||
defstream.zfree = nullptr;
|
|
||||||
defstream.opaque = nullptr;
|
|
||||||
defstream.avail_in = uInt(Data.size());
|
|
||||||
defstream.next_in = const_cast<Bytef*>(reinterpret_cast<const Bytef*>(&Data[0]));
|
|
||||||
defstream.avail_out = Biggest;
|
|
||||||
defstream.next_out = reinterpret_cast<Bytef*>(C.data());
|
|
||||||
deflateInit(&defstream, Z_BEST_COMPRESSION);
|
|
||||||
deflate(&defstream, Z_SYNC_FLUSH);
|
|
||||||
deflate(&defstream, Z_FINISH);
|
|
||||||
deflateEnd(&defstream);
|
|
||||||
size_t TotalOut = defstream.total_out;
|
|
||||||
T Ret;
|
|
||||||
Ret.resize(TotalOut);
|
|
||||||
std::fill(Ret.begin(), Ret.end(), 0);
|
|
||||||
std::copy_n(C.begin(), TotalOut, Ret.begin());
|
|
||||||
return Ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline T DeComp(const T& Compressed) {
|
|
||||||
std::array<char, Biggest> C {};
|
|
||||||
// not needed
|
|
||||||
C.fill(0);
|
|
||||||
z_stream infstream;
|
|
||||||
infstream.zalloc = nullptr;
|
|
||||||
infstream.zfree = nullptr;
|
|
||||||
infstream.opaque = nullptr;
|
|
||||||
infstream.avail_in = Biggest;
|
|
||||||
infstream.next_in = const_cast<Bytef*>(reinterpret_cast<const Bytef*>(&Compressed[0]));
|
|
||||||
infstream.avail_out = Biggest;
|
|
||||||
infstream.next_out = const_cast<Bytef*>(reinterpret_cast<const Bytef*>(C.data()));
|
|
||||||
inflateInit(&infstream);
|
|
||||||
inflate(&infstream, Z_SYNC_FLUSH);
|
|
||||||
inflate(&infstream, Z_FINISH);
|
|
||||||
inflateEnd(&infstream);
|
|
||||||
size_t TotalOut = infstream.total_out;
|
|
||||||
T Ret;
|
|
||||||
Ret.resize(TotalOut);
|
|
||||||
std::fill(Ret.begin(), Ret.end(), 0);
|
|
||||||
std::copy_n(C.begin(), TotalOut, Ret.begin());
|
|
||||||
return Ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string GetPlatformAgnosticErrorString();
|
std::string GetPlatformAgnosticErrorString();
|
||||||
#define S_DSN SU_RAW
|
#define S_DSN SU_RAW
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <charconv>
|
#include <charconv>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <fmt/core.h>
|
#include <fmt/core.h>
|
||||||
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
@ -383,3 +384,51 @@ void SplitString(const std::string& str, const char delim, std::vector<std::stri
|
|||||||
out.push_back(str.substr(start, end - start));
|
out.push_back(str.substr(start, end - start));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
std::vector<uint8_t> DeComp(std::span<const uint8_t> input) {
|
||||||
|
beammp_debugf("got {} bytes of input data", input.size());
|
||||||
|
|
||||||
|
std::vector<uint8_t> output_buffer(std::min<size_t>(input.size() * 5, 15 * 1024 * 1024));
|
||||||
|
|
||||||
|
uLongf output_size = output_buffer.size();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
int res = uncompress(
|
||||||
|
reinterpret_cast<Bytef*>(output_buffer.data()),
|
||||||
|
&output_size,
|
||||||
|
reinterpret_cast<const Bytef*>(input.data()),
|
||||||
|
static_cast<uLongf>(input.size()));
|
||||||
|
if (res == Z_BUF_ERROR) {
|
||||||
|
if (output_buffer.size() > 30 * 1024 * 1024) {
|
||||||
|
throw std::runtime_error("decompressed packet size of 30 MB exceeded");
|
||||||
|
}
|
||||||
|
beammp_warn("zlib uncompress() failed, trying with 2x buffer size of " + std::to_string(output_buffer.size() * 2));
|
||||||
|
output_buffer.resize(output_buffer.size() * 2);
|
||||||
|
output_size = output_buffer.size();
|
||||||
|
} else if (res != Z_OK) {
|
||||||
|
beammp_error("zlib uncompress() failed: " + std::to_string(res));
|
||||||
|
throw std::runtime_error("zlib uncompress() failed");
|
||||||
|
} else if (res == Z_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output_buffer.resize(output_size);
|
||||||
|
return output_buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint8_t> Comp(std::span<const uint8_t> input) {
|
||||||
|
auto max_size = compressBound(input.size());
|
||||||
|
std::vector<uint8_t> output(max_size);
|
||||||
|
uLongf output_size = output.size();
|
||||||
|
int res = compress(
|
||||||
|
reinterpret_cast<Bytef*>(output.data()),
|
||||||
|
&output_size,
|
||||||
|
reinterpret_cast<const Bytef*>(input.data()),
|
||||||
|
static_cast<uLongf>(input.size()));
|
||||||
|
if (res != Z_OK) {
|
||||||
|
beammp_error("zlib compress() failed: " + std::to_string(res));
|
||||||
|
throw std::runtime_error("zlib compress() failed");
|
||||||
|
}
|
||||||
|
beammp_debug("zlib compressed " + std::to_string(input.size()) + " B to " + std::to_string(output_size) + " B");
|
||||||
|
output.resize(output_size);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <boost/asio/ip/address.hpp>
|
#include <boost/asio/ip/address.hpp>
|
||||||
#include <boost/asio/ip/address_v4.hpp>
|
#include <boost/asio/ip/address_v4.hpp>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
typedef boost::asio::detail::socket_option::integer<SOL_SOCKET, SO_RCVTIMEO> rcv_timeout_option;
|
typedef boost::asio::detail::socket_option::integer<SOL_SOCKET, SO_RCVTIMEO> rcv_timeout_option;
|
||||||
|
|
||||||
@ -866,7 +867,7 @@ bool TNetwork::SendLarge(TClient& c, std::vector<uint8_t> Data, bool isSync) {
|
|||||||
|
|
||||||
bool TNetwork::Respond(TClient& c, const std::vector<uint8_t>& MSG, bool Rel, bool isSync) {
|
bool TNetwork::Respond(TClient& c, const std::vector<uint8_t>& MSG, bool Rel, bool isSync) {
|
||||||
char C = MSG.at(0);
|
char C = MSG.at(0);
|
||||||
if (Rel || C == 'W' || C == 'Y' || C == 'V' || C == 'E') {
|
if (Rel || C == 'W' || C == 'Y' || C == 'V' || C == 'E' || compressBound(MSG.size()) > 1024) {
|
||||||
if (C == 'O' || C == 'T' || MSG.size() > 1000) {
|
if (C == 'O' || C == 'T' || MSG.size() > 1000) {
|
||||||
return SendLarge(c, MSG, isSync);
|
return SendLarge(c, MSG, isSync);
|
||||||
} else {
|
} else {
|
||||||
@ -949,7 +950,7 @@ void TNetwork::SendToAll(TClient* c, const std::vector<uint8_t>& Data, bool Self
|
|||||||
}
|
}
|
||||||
if (Self || Client.get() != c) {
|
if (Self || Client.get() != c) {
|
||||||
if (Client->IsSynced() || Client->IsSyncing()) {
|
if (Client->IsSynced() || Client->IsSyncing()) {
|
||||||
if (Rel || C == 'W' || C == 'Y' || C == 'V' || C == 'E') {
|
if (Rel || C == 'W' || C == 'Y' || C == 'V' || C == 'E' || compressBound(Data.size()) > 1024) {
|
||||||
if (C == 'O' || C == 'T' || Data.size() > 1000) {
|
if (C == 'O' || C == 'T' || Data.size() > 1000) {
|
||||||
if (Data.size() > 400) {
|
if (Data.size() > 400) {
|
||||||
auto CompressedData = Data;
|
auto CompressedData = Data;
|
||||||
|
@ -392,13 +392,21 @@ void TServer::ParseVehicle(TClient& c, const std::string& Pckt, TNetwork& Networ
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case 't':
|
case 't': {
|
||||||
beammp_trace(std::string(("got 'Ot' packet: '")) + Packet + ("' (") + std::to_string(Packet.size()) + (")"));
|
beammp_trace(std::string(("got 'Ot' packet: '")) + Packet + ("' (") + std::to_string(Packet.size()) + (")"));
|
||||||
|
auto MaybePidVid = GetPidVid(Data.substr(0, Data.find(':', 1)));
|
||||||
|
if (MaybePidVid) {
|
||||||
|
std::tie(PID, VID) = MaybePidVid.value();
|
||||||
|
}
|
||||||
|
if (PID != -1 && VID != -1 && PID == c.GetID()) {
|
||||||
|
Network.SendToAll(&c, StringToVector(Packet), false, true);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case 'm': {
|
||||||
Network.SendToAll(&c, StringToVector(Packet), false, true);
|
Network.SendToAll(&c, StringToVector(Packet), false, true);
|
||||||
return;
|
return;
|
||||||
case 'm':
|
}
|
||||||
Network.SendToAll(&c, StringToVector(Packet), true, true);
|
|
||||||
return;
|
|
||||||
default:
|
default:
|
||||||
beammp_trace(std::string(("possibly not implemented: '") + Packet + ("' (") + std::to_string(Packet.size()) + (")")));
|
beammp_trace(std::string(("possibly not implemented: '") + Packet + ("' (") + std::to_string(Packet.size()) + (")")));
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user