2010-11-29 19:13:04 +01:00
|
|
|
/*
|
2013-02-24 18:40:43 +01:00
|
|
|
Minetest
|
2013-02-24 19:38:45 +01:00
|
|
|
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
|
2010-11-29 19:13:04 +01:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
2012-06-05 16:56:56 +02:00
|
|
|
it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2.1 of the License, or
|
2010-11-29 19:13:04 +01:00
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2012-06-05 16:56:56 +02:00
|
|
|
GNU Lesser General Public License for more details.
|
2010-11-29 19:13:04 +01:00
|
|
|
|
2012-06-05 16:56:56 +02:00
|
|
|
You should have received a copy of the GNU Lesser General Public License along
|
2010-11-29 19:13:04 +01:00
|
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
*/
|
|
|
|
|
2017-08-17 22:19:39 +02:00
|
|
|
#pragma once
|
2010-11-27 00:02:21 +01:00
|
|
|
|
2021-09-17 18:14:25 +02:00
|
|
|
#include "irrlichttypes.h"
|
2017-08-24 08:28:54 +02:00
|
|
|
#include "peerhandler.h"
|
2010-11-27 00:02:21 +01:00
|
|
|
#include "socket.h"
|
|
|
|
#include "constants.h"
|
2012-06-17 01:40:36 +02:00
|
|
|
#include "util/pointer.h"
|
|
|
|
#include "util/container.h"
|
2014-01-06 20:05:28 +01:00
|
|
|
#include "util/numeric.h"
|
2024-03-12 14:13:24 +01:00
|
|
|
#include "porting.h"
|
2017-09-27 19:47:36 +02:00
|
|
|
#include "networkprotocol.h"
|
2012-06-17 01:40:36 +02:00
|
|
|
#include <iostream>
|
2020-07-23 19:47:58 +02:00
|
|
|
#include <vector>
|
2012-12-20 18:19:49 +01:00
|
|
|
#include <map>
|
2010-11-27 00:02:21 +01:00
|
|
|
|
2015-03-31 10:35:51 +02:00
|
|
|
class NetworkPacket;
|
|
|
|
|
2010-11-27 00:02:21 +01:00
|
|
|
namespace con
|
|
|
|
{
|
|
|
|
|
2017-08-25 15:53:56 +02:00
|
|
|
class ConnectionReceiveThread;
|
|
|
|
class ConnectionSendThread;
|
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
enum rate_stat_type {
|
|
|
|
CUR_DL_RATE,
|
|
|
|
AVG_DL_RATE,
|
|
|
|
CUR_INC_RATE,
|
|
|
|
AVG_INC_RATE,
|
|
|
|
CUR_LOSS_RATE,
|
|
|
|
AVG_LOSS_RATE,
|
2010-11-27 00:02:21 +01:00
|
|
|
};
|
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
class Peer;
|
2010-11-27 00:02:21 +01:00
|
|
|
|
2024-03-12 14:13:24 +01:00
|
|
|
// FIXME: Peer refcounting should generally be replaced by std::shared_ptr
|
2024-03-07 15:10:52 +01:00
|
|
|
class PeerHelper
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
|
|
|
public:
|
2024-03-07 15:10:52 +01:00
|
|
|
PeerHelper() = default;
|
2024-03-12 14:13:24 +01:00
|
|
|
inline PeerHelper(Peer *peer) { *this = peer; }
|
2024-03-07 15:10:52 +01:00
|
|
|
~PeerHelper();
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-03-12 14:13:24 +01:00
|
|
|
PeerHelper& operator=(Peer *peer);
|
|
|
|
inline Peer* operator->() const { return m_peer; }
|
|
|
|
inline Peer* operator&() const { return m_peer; }
|
|
|
|
|
|
|
|
inline bool operator!() { return !m_peer; }
|
|
|
|
inline bool operator!=(std::nullptr_t) { return !!m_peer; }
|
2010-11-27 00:02:21 +01:00
|
|
|
|
|
|
|
private:
|
2024-03-07 15:10:52 +01:00
|
|
|
Peer *m_peer = nullptr;
|
2010-11-27 00:02:21 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
2024-03-07 15:10:52 +01:00
|
|
|
Connection
|
2010-11-27 00:02:21 +01:00
|
|
|
*/
|
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
enum ConnectionEventType {
|
|
|
|
CONNEVENT_NONE,
|
|
|
|
CONNEVENT_DATA_RECEIVED,
|
|
|
|
CONNEVENT_PEER_ADDED,
|
|
|
|
CONNEVENT_PEER_REMOVED,
|
|
|
|
CONNEVENT_BIND_FAILED,
|
2014-01-06 20:05:28 +01:00
|
|
|
};
|
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
struct ConnectionEvent;
|
|
|
|
typedef std::shared_ptr<ConnectionEvent> ConnectionEventPtr;
|
2021-12-01 20:22:33 +01:00
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
// This is very similar to ConnectionCommand
|
|
|
|
struct ConnectionEvent
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
2024-03-07 15:10:52 +01:00
|
|
|
const ConnectionEventType type;
|
|
|
|
session_t peer_id = 0;
|
2017-09-05 22:14:56 +02:00
|
|
|
Buffer<u8> data;
|
2024-03-07 15:10:52 +01:00
|
|
|
bool timeout = false;
|
|
|
|
Address address;
|
2014-04-26 01:15:46 +02:00
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
// We don't want to copy "data"
|
|
|
|
DISABLE_CLASS_COPY(ConnectionEvent);
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
static ConnectionEventPtr create(ConnectionEventType type);
|
|
|
|
static ConnectionEventPtr dataReceived(session_t peer_id, const Buffer<u8> &data);
|
|
|
|
static ConnectionEventPtr peerAdded(session_t peer_id, Address address);
|
|
|
|
static ConnectionEventPtr peerRemoved(session_t peer_id, bool is_timeout, Address address);
|
|
|
|
static ConnectionEventPtr bindFailed();
|
2021-09-27 17:45:44 +02:00
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
const char *describe() const;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
|
|
|
private:
|
2024-03-07 15:10:52 +01:00
|
|
|
ConnectionEvent(ConnectionEventType type_) :
|
|
|
|
type(type_) {}
|
2010-11-27 00:02:21 +01:00
|
|
|
};
|
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
struct ConnectionCommand;
|
|
|
|
typedef std::shared_ptr<ConnectionCommand> ConnectionCommandPtr;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
struct BufferedPacket;
|
|
|
|
typedef std::shared_ptr<BufferedPacket> BufferedPacketPtr;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
|
|
|
class Connection;
|
2024-03-07 15:10:52 +01:00
|
|
|
class PeerHandler;
|
2014-04-26 01:15:46 +02:00
|
|
|
|
2014-01-06 20:05:28 +01:00
|
|
|
class Peer {
|
|
|
|
public:
|
|
|
|
friend class PeerHelper;
|
|
|
|
|
|
|
|
virtual ~Peer() {
|
2015-04-07 12:13:12 +02:00
|
|
|
MutexAutoLock usage_lock(m_exclusive_access_mutex);
|
2015-03-06 11:21:51 +01:00
|
|
|
FATAL_ERROR_IF(m_usage != 0, "Reference counting failure");
|
2024-03-12 14:13:24 +01:00
|
|
|
}
|
2014-01-06 20:05:28 +01:00
|
|
|
|
|
|
|
// Unique id of the peer
|
2021-12-01 20:22:33 +01:00
|
|
|
const session_t id;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
|
|
|
void Drop();
|
|
|
|
|
2021-12-01 20:22:33 +01:00
|
|
|
virtual void PutReliableSendCommand(ConnectionCommandPtr &c,
|
2014-01-06 20:05:28 +01:00
|
|
|
unsigned int max_packet_size) {};
|
|
|
|
|
2024-03-12 14:13:24 +01:00
|
|
|
virtual const Address &getAddress() const = 0;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-03-12 14:13:24 +01:00
|
|
|
bool isPendingDeletion() const {
|
|
|
|
MutexAutoLock lock(m_exclusive_access_mutex);
|
|
|
|
return m_pending_deletion;
|
|
|
|
}
|
|
|
|
void ResetTimeout() {
|
|
|
|
MutexAutoLock lock(m_exclusive_access_mutex);
|
|
|
|
m_timeout_counter = 0;
|
|
|
|
}
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-03-12 14:13:24 +01:00
|
|
|
bool isHalfOpen() const {
|
|
|
|
MutexAutoLock lock(m_exclusive_access_mutex);
|
|
|
|
return m_half_open;
|
|
|
|
}
|
|
|
|
void SetFullyOpen() {
|
|
|
|
MutexAutoLock lock(m_exclusive_access_mutex);
|
|
|
|
m_half_open = false;
|
|
|
|
}
|
2024-01-05 00:31:14 +01:00
|
|
|
|
2024-01-05 12:24:14 +01:00
|
|
|
virtual bool isTimedOut(float timeout, std::string &reason);
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2020-04-08 20:12:58 +02:00
|
|
|
unsigned int m_increment_packets_remaining = 0;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
|
|
|
virtual u16 getNextSplitSequenceNumber(u8 channel) { return 0; };
|
|
|
|
virtual void setNextSplitSequenceNumber(u8 channel, u16 seqnum) {};
|
2021-12-01 20:22:33 +01:00
|
|
|
virtual SharedBuffer<u8> addSplitPacket(u8 channel, BufferedPacketPtr &toadd,
|
2017-08-25 15:53:56 +02:00
|
|
|
bool reliable)
|
|
|
|
{
|
2024-03-12 14:13:24 +01:00
|
|
|
FATAL_ERROR("unimplemented in abstract class");
|
|
|
|
}
|
2014-01-06 20:05:28 +01:00
|
|
|
|
|
|
|
virtual bool Ping(float dtime, SharedBuffer<u8>& data) { return false; };
|
|
|
|
|
|
|
|
virtual float getStat(rtt_stat_type type) const {
|
|
|
|
switch (type) {
|
|
|
|
case MIN_RTT:
|
|
|
|
return m_rtt.min_rtt;
|
|
|
|
case MAX_RTT:
|
|
|
|
return m_rtt.max_rtt;
|
|
|
|
case AVG_RTT:
|
|
|
|
return m_rtt.avg_rtt;
|
|
|
|
case MIN_JITTER:
|
|
|
|
return m_rtt.jitter_min;
|
|
|
|
case MAX_JITTER:
|
|
|
|
return m_rtt.jitter_max;
|
|
|
|
case AVG_JITTER:
|
|
|
|
return m_rtt.jitter_avg;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
2024-03-12 14:13:24 +01:00
|
|
|
|
2014-01-06 20:05:28 +01:00
|
|
|
protected:
|
2024-03-12 14:13:24 +01:00
|
|
|
Peer(session_t id, const Address &address, Connection *connection) :
|
|
|
|
id(id),
|
|
|
|
m_connection(connection),
|
|
|
|
address(address),
|
|
|
|
m_last_timeout_check(porting::getTimeMs())
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-01-06 20:05:28 +01:00
|
|
|
virtual void reportRTT(float rtt) {};
|
|
|
|
|
2019-02-16 00:39:22 +01:00
|
|
|
void RTTStatistics(float rtt,
|
|
|
|
const std::string &profiler_id = "",
|
|
|
|
unsigned int num_samples = 1000);
|
2014-01-06 20:05:28 +01:00
|
|
|
|
|
|
|
bool IncUseCount();
|
|
|
|
void DecUseCount();
|
|
|
|
|
2021-12-01 20:22:33 +01:00
|
|
|
mutable std::mutex m_exclusive_access_mutex;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2017-06-21 08:28:57 +02:00
|
|
|
bool m_pending_deletion = false;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-03-12 14:13:24 +01:00
|
|
|
Connection *m_connection;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
|
|
|
// Address of the peer
|
|
|
|
Address address;
|
|
|
|
|
|
|
|
// Ping timer
|
2017-06-21 08:28:57 +02:00
|
|
|
float m_ping_timer = 0.0f;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-03-12 14:13:24 +01:00
|
|
|
private:
|
2014-01-06 20:05:28 +01:00
|
|
|
struct rttstats {
|
2017-06-21 08:28:57 +02:00
|
|
|
float jitter_min = FLT_MAX;
|
|
|
|
float jitter_max = 0.0f;
|
2020-05-01 21:44:28 +02:00
|
|
|
float jitter_avg = -1.0f;
|
2017-06-21 08:28:57 +02:00
|
|
|
float min_rtt = FLT_MAX;
|
|
|
|
float max_rtt = 0.0f;
|
2020-05-01 21:44:28 +02:00
|
|
|
float avg_rtt = -1.0f;
|
2014-01-06 20:05:28 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
rttstats m_rtt;
|
2020-05-01 21:44:28 +02:00
|
|
|
float m_last_rtt = -1.0f;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-01-05 00:31:14 +01:00
|
|
|
/*
|
|
|
|
Until the peer has communicated with us using their assigned peer id
|
|
|
|
the connection is considered half-open.
|
|
|
|
During this time we inhibit re-sending any reliables or pings. This
|
|
|
|
is to avoid spending too many resources on a potential DoS attack
|
|
|
|
and to make sure Minetest servers are not useful for UDP amplificiation.
|
|
|
|
*/
|
|
|
|
bool m_half_open = true;
|
|
|
|
|
2014-01-06 20:05:28 +01:00
|
|
|
// current usage count
|
2017-06-21 08:28:57 +02:00
|
|
|
unsigned int m_usage = 0;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
|
|
|
// Seconds from last receive
|
2017-06-21 08:28:57 +02:00
|
|
|
float m_timeout_counter = 0.0f;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2017-05-26 14:03:36 +02:00
|
|
|
u64 m_last_timeout_check;
|
2014-01-06 20:05:28 +01:00
|
|
|
};
|
|
|
|
|
2024-03-07 15:10:52 +01:00
|
|
|
class UDPPeer;
|
2017-08-24 08:28:54 +02:00
|
|
|
|
2014-01-06 20:05:28 +01:00
|
|
|
class Connection
|
2010-11-27 00:02:21 +01:00
|
|
|
{
|
|
|
|
public:
|
2014-01-06 20:05:28 +01:00
|
|
|
friend class ConnectionSendThread;
|
|
|
|
friend class ConnectionReceiveThread;
|
|
|
|
|
2013-06-23 09:31:22 +02:00
|
|
|
Connection(u32 protocol_id, u32 max_packet_size, float timeout, bool ipv6,
|
2011-10-20 22:04:09 +02:00
|
|
|
PeerHandler *peerhandler);
|
2010-11-27 00:02:21 +01:00
|
|
|
~Connection();
|
2011-10-20 22:04:09 +02:00
|
|
|
|
|
|
|
/* Interface */
|
2021-12-01 20:22:33 +01:00
|
|
|
ConnectionEventPtr waitEvent(u32 timeout_ms);
|
|
|
|
|
|
|
|
void putCommand(ConnectionCommandPtr c);
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2017-08-25 15:53:56 +02:00
|
|
|
void SetTimeoutMs(u32 timeout) { m_bc_receive_timeout = timeout; }
|
2014-02-05 21:24:46 +01:00
|
|
|
void Serve(Address bind_addr);
|
2010-11-27 00:02:21 +01:00
|
|
|
void Connect(Address address);
|
|
|
|
bool Connected();
|
2010-12-24 16:08:50 +01:00
|
|
|
void Disconnect();
|
2023-03-29 11:42:50 +02:00
|
|
|
bool ReceiveTimeoutMs(NetworkPacket *pkt, u32 timeout_ms);
|
|
|
|
void Receive(NetworkPacket *pkt);
|
2019-11-14 17:38:15 +01:00
|
|
|
bool TryReceive(NetworkPacket *pkt);
|
2017-09-27 19:47:36 +02:00
|
|
|
void Send(session_t peer_id, u8 channelnum, NetworkPacket *pkt, bool reliable);
|
|
|
|
session_t GetPeerID() const { return m_peer_id; }
|
|
|
|
Address GetPeerAddress(session_t peer_id);
|
|
|
|
float getPeerStat(session_t peer_id, rtt_stat_type type);
|
2014-04-26 01:15:46 +02:00
|
|
|
float getLocalStat(rate_stat_type type);
|
2021-09-27 17:45:44 +02:00
|
|
|
u32 GetProtocolID() const { return m_protocol_id; };
|
2014-01-06 20:05:28 +01:00
|
|
|
const std::string getDesc();
|
2017-09-27 19:47:36 +02:00
|
|
|
void DisconnectPeer(session_t peer_id);
|
2014-01-06 20:05:28 +01:00
|
|
|
|
|
|
|
protected:
|
2017-09-27 19:47:36 +02:00
|
|
|
PeerHelper getPeerNoEx(session_t peer_id);
|
2024-01-05 11:03:19 +01:00
|
|
|
session_t lookupPeer(const Address& sender);
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-03-12 14:13:24 +01:00
|
|
|
session_t createPeer(const Address& sender, int fd);
|
|
|
|
UDPPeer* createServerPeer(const Address& sender);
|
2017-09-27 19:47:36 +02:00
|
|
|
bool deletePeer(session_t peer_id, bool timeout);
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2017-09-27 19:47:36 +02:00
|
|
|
void SetPeerID(session_t id) { m_peer_id = id; }
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-01-05 00:31:14 +01:00
|
|
|
void doResendOne(session_t peer_id);
|
|
|
|
|
2017-09-27 19:47:36 +02:00
|
|
|
void sendAck(session_t peer_id, u8 channelnum, u16 seqnum);
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2020-07-23 19:47:58 +02:00
|
|
|
std::vector<session_t> getPeerIDs()
|
2015-08-01 13:53:15 +02:00
|
|
|
{
|
2015-04-07 12:13:12 +02:00
|
|
|
MutexAutoLock peerlock(m_peers_mutex);
|
2015-08-01 13:53:15 +02:00
|
|
|
return m_peer_ids;
|
|
|
|
}
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2024-01-05 13:54:50 +01:00
|
|
|
u32 getActiveCount();
|
|
|
|
|
2014-01-06 20:05:28 +01:00
|
|
|
UDPSocket m_udpSocket;
|
2021-09-17 18:14:25 +02:00
|
|
|
// Command queue: user -> SendThread
|
2021-12-01 20:22:33 +01:00
|
|
|
MutexedQueue<ConnectionCommandPtr> m_command_queue;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2021-12-01 20:22:33 +01:00
|
|
|
void putEvent(ConnectionEventPtr e);
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2017-08-25 15:53:56 +02:00
|
|
|
void TriggerSend();
|
2021-12-02 00:54:12 +01:00
|
|
|
|
|
|
|
bool ConnectedToServer()
|
2020-11-02 22:21:03 +01:00
|
|
|
{
|
|
|
|
return getPeerNoEx(PEER_ID_SERVER) != nullptr;
|
|
|
|
}
|
2014-01-06 20:05:28 +01:00
|
|
|
private:
|
2021-09-17 18:14:25 +02:00
|
|
|
// Event queue: ReceiveThread -> user
|
2021-12-01 20:22:33 +01:00
|
|
|
MutexedQueue<ConnectionEventPtr> m_event_queue;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2017-09-27 19:47:36 +02:00
|
|
|
session_t m_peer_id = 0;
|
2014-01-06 20:05:28 +01:00
|
|
|
u32 m_protocol_id;
|
[Patch 2/4] Network rework: packet writing, sending and cleanups
NetworkPacket.cpp:
* Remove some deprecated functions, we must use streaming interface
* m_data converted from u8* to std::vector<u8>
* Add an exporter to forge packet to Connection object
* implement operator << std::wstring. n
* implement operator << std::string
* dynamic resize when write packet content.
* fix string writing and performances.
* create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Reliability
* Transmit channel
* Implement putRawString for some ugly char (_INIT packet), and use it.
* Many packet read and write migrated
* Implement oldForgePacket to interface writing with current connection
* fix U8/char/bool writing
* fix string writing and performances.
* add some missing functions
* Use v3s16 read instead of reading x,y,z separately
* Add irr::video::SColor support into packets
* Add some missing handlers
* Add a template function to increase offset
* Throw a serialization error on packet reading (must be improved)
PacketFactories:
* Create ServerCommandFactory, used by client to get useful informations about packet processing (sending).
* Create ClientCommandFactory, used by server to get useful informations about packet processing (sending).
Client.cpp:
* implement NetworkPacket ::Send interface.
* Move packet handlers to a dedicated file
* Remove Client::Send(SharedBuffer)
Server.cpp:
* implement NetworkPacket ::Send interface.
* Rewrite all packets using NetworkPacket
* Move packet handlers to a dedicated file
* Remove Server::Send(SharedBuffer)
ClientIface.cpp:
* Remove sendToAll(SharedBuffer<u8>)
Connection.hpp rework:
* Remove duplicate include
* Remove duplicate negation
* Remove a useless variable
* Improve code performance by using a m_peers_list instead of scanning m_peers map
* Remove Connection::Send(SharedBuffer)
* Fix useafterfree into NetworkPacket Sending
* Remove unused Connection::sendToAll
Test.cpp:
* Remove dead code
* Update tests to use NetworkPackets
Misc:
* add new wrappers to Send packets in client, using NetworkPacket
* Add NetworkPacket methods for Connection
* coding style fix
* dead code since changes cleanup
* Use v3s16 read instead of reading x,y,z separately in some packets
* Use different files to handle packets received by client and server
* Cleanup: Remove useless includes
ok @Zeno-
Tested by @Zeno- @VanessaE and @nerzhul on running servers
2015-01-16 11:37:49 +01:00
|
|
|
|
2017-09-27 19:47:36 +02:00
|
|
|
std::map<session_t, Peer *> m_peers;
|
2020-07-23 19:47:58 +02:00
|
|
|
std::vector<session_t> m_peer_ids;
|
2017-06-06 16:29:28 +02:00
|
|
|
std::mutex m_peers_mutex;
|
2010-11-27 00:02:21 +01:00
|
|
|
|
2017-08-25 15:53:56 +02:00
|
|
|
std::unique_ptr<ConnectionSendThread> m_sendThread;
|
|
|
|
std::unique_ptr<ConnectionReceiveThread> m_receiveThread;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2021-12-01 20:22:33 +01:00
|
|
|
mutable std::mutex m_info_mutex;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2011-10-20 22:04:09 +02:00
|
|
|
// Backwards compatibility
|
|
|
|
PeerHandler *m_bc_peerhandler;
|
2017-08-25 15:53:56 +02:00
|
|
|
u32 m_bc_receive_timeout = 0;
|
2014-01-06 20:05:28 +01:00
|
|
|
|
2017-06-21 08:28:57 +02:00
|
|
|
bool m_shutting_down = false;
|
2010-11-27 00:02:21 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace
|