Skip to content

Commit b89ccd0

Browse files
committed
add custom versioning string during handshake
1 parent 4e1e0b7 commit b89ccd0

File tree

4 files changed

+48
-5
lines changed

4 files changed

+48
-5
lines changed

includes/FastEngine/network/C_netCommand.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151
1000 \
5252
}
5353

54+
#define FGE_NET_MAX_VERSIONING_STRING_SIZE 32
55+
5456
namespace fge::net
5557
{
5658

@@ -131,6 +133,9 @@ class FGE_API NetConnectCommand : public NetCommand
131133
using NetCommand::NetCommand;
132134
~NetConnectCommand() final = default;
133135

136+
void setVersioningString(std::string_view versioningString);
137+
[[nodiscard]] std::string const& getVersioningString() const;
138+
134139
[[nodiscard]] NetCommandTypes getType() const override { return NetCommandTypes::CONNECT; }
135140

136141
[[nodiscard]] NetCommandResults update(TransmitPacketPtr& buffPacket,
@@ -159,6 +164,7 @@ class FGE_API NetConnectCommand : public NetCommand
159164
} g_state{States::TRANSMIT_FGE_HANDSHAKE};
160165
bool g_mtuTested{false};
161166
std::future<uint16_t> g_mtuFuture;
167+
std::string g_versioningString;
162168
};
163169

164170
class FGE_API NetDisconnectCommand : public NetCommand

includes/FastEngine/network/C_server.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,9 @@ class FGE_API ServerSideNetUdp
195195
ServerSideNetUdp& operator=(ServerSideNetUdp const& r) = delete;
196196
ServerSideNetUdp& operator=(ServerSideNetUdp&& r) noexcept = delete;
197197

198+
void setVersioningString(std::string_view versioningString);
199+
[[nodiscard]] std::string const& getVersioningString() const;
200+
198201
[[nodiscard]] bool
199202
start(Port bindPort, IpAddress const& bindIp, IpAddress::Types addressType = IpAddress::Types::None);
200203
[[nodiscard]] bool start(IpAddress::Types addressType = IpAddress::Types::None);
@@ -267,6 +270,8 @@ class FGE_API ServerSideNetUdp
267270
bool g_running;
268271

269272
void* g_crypt_ctx;
273+
274+
std::string g_versioningString;
270275
};
271276

272277
/**
@@ -298,7 +303,7 @@ class FGE_API ClientSideNetUdp : public NetFluxUdp
298303
[[nodiscard]] bool isRunning() const;
299304

300305
[[nodiscard]] std::future<uint16_t> retrieveMTU();
301-
[[nodiscard]] std::future<bool> connect();
306+
[[nodiscard]] std::future<bool> connect(std::string_view versioningString = std::string_view{});
302307
[[nodiscard]] std::future<void> disconnect();
303308

304309
[[nodiscard]] IpAddress::Types getAddressType() const;

sources/network/C_netCommand.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,20 @@ NetCommandResults NetMTUCommand::onReceive(std::unique_ptr<ProtocolPacket>& pack
197197
return NetCommandResults::WORKING;
198198
}
199199

200+
void NetConnectCommand::setVersioningString(std::string_view versioningString)
201+
{
202+
if (versioningString.size() > FGE_NET_MAX_VERSIONING_STRING_SIZE)
203+
{
204+
throw Exception("Versioning string too long");
205+
}
206+
207+
this->g_versioningString = versioningString;
208+
}
209+
std::string const& NetConnectCommand::getVersioningString() const
210+
{
211+
return this->g_versioningString;
212+
}
213+
200214
NetCommandResults NetConnectCommand::update(TransmitPacketPtr& buffPacket,
201215
[[maybe_unused]] IpAddress::Types addressType,
202216
Client& client,
@@ -213,7 +227,8 @@ NetCommandResults NetConnectCommand::update(TransmitPacketPtr& buffPacket,
213227
client._mtuFinalizedFlag = false;
214228

215229
buffPacket = CreatePacket(NET_INTERNAL_ID_FGE_HANDSHAKE);
216-
buffPacket->doNotDiscard().doNotReorder().doNotFragment() << FGE_NET_HANDSHAKE_STRING;
230+
buffPacket->doNotDiscard().doNotReorder().doNotFragment()
231+
<< FGE_NET_HANDSHAKE_STRING << this->g_versioningString;
217232
this->_g_timeout = std::chrono::milliseconds::zero();
218233
this->g_state = States::WAITING_FGE_HANDSHAKE;
219234
break;

sources/network/C_server.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ void ServerNetFluxUdp::processClients()
232232
this->g_commandsUpdateTick = std::chrono::milliseconds::zero();
233233
}
234234
}
235+
235236
FluxProcessResults
236237
ServerNetFluxUdp::process(ClientSharedPtr& refClient, ReceivedPacketPtr& packet, bool allowUnknownClient)
237238
{
@@ -466,10 +467,15 @@ FluxProcessResults ServerNetFluxUdp::processUnknownClient(ClientSharedPtr& refCl
466467

467468
using namespace fge::net::rules;
468469
std::string handshakeString;
470+
std::string versioningString;
469471
auto const err = RValid(RSizeMustEqual<std::string>(sizeof(FGE_NET_HANDSHAKE_STRING) - 1,
470472
{packet->packet(), &handshakeString}))
471-
.end();
472-
if (err || !packet->endReached() || handshakeString != FGE_NET_HANDSHAKE_STRING)
473+
.and_then([&](auto& chain) {
474+
return RValid(RSizeRange<std::string>(0, FGE_NET_MAX_VERSIONING_STRING_SIZE,
475+
chain.template newChain<std::string>(&versioningString)));
476+
}).end();
477+
if (err || !packet->endReached() || handshakeString != FGE_NET_HANDSHAKE_STRING ||
478+
versioningString != this->g_server->getVersioningString())
473479
{ //TODO: endReached() check should be done in .end() method
474480
std::cout << "Handshake failed" << std::endl;
475481
return FluxProcessResults::NOT_RETRIEVABLE;
@@ -713,6 +719,16 @@ ServerSideNetUdp::~ServerSideNetUdp()
713719
this->stop();
714720
}
715721

722+
void ServerSideNetUdp::setVersioningString(std::string_view versioningString)
723+
{
724+
std::scoped_lock const lock{this->g_mutexServer};
725+
this->g_versioningString = versioningString;
726+
}
727+
std::string const& ServerSideNetUdp::getVersioningString() const
728+
{
729+
return this->g_versioningString;
730+
}
731+
716732
bool ServerSideNetUdp::start(Port bindPort, IpAddress const& bindIp, IpAddress::Types addressType)
717733
{
718734
if (this->g_running)
@@ -1238,7 +1254,7 @@ std::future<uint16_t> ClientSideNetUdp::retrieveMTU()
12381254

12391255
return future;
12401256
}
1241-
std::future<bool> ClientSideNetUdp::connect()
1257+
std::future<bool> ClientSideNetUdp::connect(std::string_view versioningString)
12421258
{
12431259
if (!this->g_running)
12441260
{
@@ -1247,6 +1263,7 @@ std::future<bool> ClientSideNetUdp::connect()
12471263

12481264
auto command = std::make_unique<NetConnectCommand>(&this->g_commands);
12491265
auto future = command->get_future();
1266+
command->setVersioningString(versioningString);
12501267

12511268
std::scoped_lock const lock(this->g_mutexCommands);
12521269
this->g_commands.push_back(std::move(command));

0 commit comments

Comments
 (0)