mirror of
https://github.com/BeamMP/BeamMP-Server.git
synced 2026-04-02 22:06:26 +00:00
Remove clients when shutting down the socket
This commit is contained in:
@@ -40,6 +40,7 @@ typedef boost::asio::detail::socket_option::integer<SOL_SOCKET, SO_RCVTIMEO> rcv
|
|||||||
|
|
||||||
static constexpr uint8_t MAX_CONCURRENT_CONNECTIONS = 10;
|
static constexpr uint8_t MAX_CONCURRENT_CONNECTIONS = 10;
|
||||||
static constexpr uint8_t MAX_GLOBAL_CONNECTIONS = 128;
|
static constexpr uint8_t MAX_GLOBAL_CONNECTIONS = 128;
|
||||||
|
static constexpr uint8_t READ_TIMEOUT_S = 10; //seconds
|
||||||
|
|
||||||
std::vector<uint8_t> StringToVector(const std::string& Str) {
|
std::vector<uint8_t> StringToVector(const std::string& Str) {
|
||||||
return std::vector<uint8_t>(Str.data(), Str.data() + Str.size());
|
return std::vector<uint8_t>(Str.data(), Str.data() + Str.size());
|
||||||
@@ -279,11 +280,22 @@ void TNetwork::Identify(TConnection&& RawConnection) {
|
|||||||
RegisterThreadAuto();
|
RegisterThreadAuto();
|
||||||
char Code;
|
char Code;
|
||||||
|
|
||||||
boost::system::error_code ec;
|
boost::system::error_code ec = ReadWithTimeout(RawConnection, &Code, 1, std::chrono::seconds(READ_TIMEOUT_S));
|
||||||
ReadWithTimeout(RawConnection, &Code, 1, std::chrono::seconds(10));
|
|
||||||
if (ec) {
|
if (ec) {
|
||||||
// TODO: is this right?!
|
// TODO: is this right?!
|
||||||
|
beammp_debug("Error occured reading code");
|
||||||
RawConnection.Socket.shutdown(socket_base::shutdown_both, ec);
|
RawConnection.Socket.shutdown(socket_base::shutdown_both, ec);
|
||||||
|
mClientMapMutex.lock();
|
||||||
|
{
|
||||||
|
std::string ClientIP = RawConnection.SockAddr.address().to_string();
|
||||||
|
if (mClientMap[ClientIP] > 0) {
|
||||||
|
mClientMap[ClientIP]--;
|
||||||
|
}
|
||||||
|
if (mClientMap[ClientIP] == 0) {
|
||||||
|
mClientMap.erase(ClientIP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mClientMapMutex.unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::shared_ptr<TClient> Client { nullptr };
|
std::shared_ptr<TClient> Client { nullptr };
|
||||||
@@ -314,6 +326,17 @@ void TNetwork::Identify(TConnection&& RawConnection) {
|
|||||||
beammp_errorf("Error during handling of code {} - client left in invalid state, closing socket: {}", Code, e.what());
|
beammp_errorf("Error during handling of code {} - client left in invalid state, closing socket: {}", Code, e.what());
|
||||||
boost::system::error_code ec;
|
boost::system::error_code ec;
|
||||||
RawConnection.Socket.shutdown(boost::asio::socket_base::shutdown_both, ec);
|
RawConnection.Socket.shutdown(boost::asio::socket_base::shutdown_both, ec);
|
||||||
|
mClientMapMutex.lock();
|
||||||
|
{
|
||||||
|
std::string ClientIP = RawConnection.SockAddr.address().to_string();
|
||||||
|
if (mClientMap[ClientIP] > 0) {
|
||||||
|
mClientMap[ClientIP]--;
|
||||||
|
}
|
||||||
|
if (mClientMap[ClientIP] == 0) {
|
||||||
|
mClientMap.erase(ClientIP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mClientMapMutex.unlock();
|
||||||
if (ec) {
|
if (ec) {
|
||||||
beammp_debugf("Failed to shutdown client socket: {}", ec.message());
|
beammp_debugf("Failed to shutdown client socket: {}", ec.message());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user