Added Udp test code.

This commit is contained in:
2025-01-27 01:02:02 -05:00
parent 69b2cbc32b
commit 3498d514ad

View File

@@ -4,6 +4,10 @@
#include <Sockets/UdpServer.hpp>
#include <Core/Serialization.hpp>
#include <Core/Loggers.hpp>
#include <J3ML/J3ML.hpp>
#include <Core/Reflection.hpp>
#include <Core/Generator.hpp>
/* Networking Design Notes
*
@@ -12,23 +16,30 @@
*
*/
class ArgsParser
{
public:
ArgsParser(int argc, char** argv)
{
}
explicit ArgsParser(std::vector<std::string> args)
{
}
};
//jlog::GenericLogger ServerLog {"Server", jlog::GlobalLogFile, Colors::Green, Colors::Gray, Colors::Gray, Colors::Gray};;
//jlog::GenericLogger ClientLog {"Client", jlog::GlobalLogFile, Colors::Blue, Colors::Gray, Colors::Gray, Colors::Gray};;
using namespace CaveGame;
using namespace CaveGame::Core;
using namespace std::chrono_literals;
using namespace J3ML::SizedIntegralTypes;
template <typename T>
void test(T value, T expected)
{
if (value != expected)
Logs::Error(std::format("rtt<{}> fail: expected {}, value {}", Reflection::type_name<T>(), expected, value));
else
Logs::Server(std::format("rtt<{}> success: expected {}, value {}", Reflection::type_name<T>(), expected, value));
}
template <typename T>
void test_diff(T value, T expected, T epsilon)
{
T diff = std::abs(std::abs(value) - std::abs(expected));
if (diff > epsilon)
Logs::Error(std::format("rtt<{}> fail: expected {}, value {}, diff {}", Reflection::type_name<T>(), expected, value, diff));
else
Logs::Server(std::format("rtt<{}> success: expected {}, value {}, diff {}", Reflection::type_name<T>(), expected, value, diff));
}
bool server_running = true;
bool client_running = true;
@@ -37,25 +48,54 @@ void RunServer() {
std::cout << "Starting server thread." << std::endl;
UDPServer<> udpServer;
UDPServer<32776> udpServer;
udpServer.onRawMessageReceived = [&](const char* message, int length, std::string ipv4, uint16_t port)
{
std::cout << "server: " << ipv4 << ":" << port << " => " << message << "(" << length << ")" << std::endl;
udpServer.onRawMessageReceived = [&](const char* message, int length, std::string ipv4, uint16_t port) {
Logs::Server(std::format("recv from {}:{} => {} ({} bytes)", ipv4, port, std::string(message), length));
//std::cout << "server: " << ipv4 << ":" << port << " => " << message << "(" << length << ")" << std::endl;
if (length == 32776)
{
std::cout << "peter" << std::endl;
}
if (message[0] == 21) {
Logs::Server(std::format("Received encoded-data buffer, decoding..."));
Buffer b;
b.size = length;
b.data = new uint8_t[length];
b.index = 1;
memcpy(b.data, message, length);
test<std::string>(read_string(b), "encoded-data");
test<u8>(read_u8(b), 7);
test<u8>(read_u8(b), 12);
test<u16>(read_u16(b), 32000);
test<u32>(read_u32(b), 666420);
test<u64>(read_u64(b), 420690000);
test<s8>(read_s8(b), -64);
test<float>(read_f32(b), 3.14159f);
test_diff<float>(read_f16(b), 3.14159f, 1e-2f);
test<std::string>(read_string(b), "Tetsuo!.!.!..!!..!!");
}
if (strcmp(message, "ping") == 0)
{
udpServer.SendTo("pong", ipv4, port);
return;
//return;
}
if (strcmp(message, "poll") == 0)
{
udpServer.SendTo("CaveGame Server v1.0.0 Protocol v1.", ipv4, port);
return;
//return;
}
udpServer.SendTo(message, length, ipv4, port);
//udpServer.SendTo(message, length, ipv4, port);
};
// Bind the server to a port.
@@ -83,25 +123,89 @@ void RunServer() {
udpServer.Close();
}
/*
Packet - up to 1024 bytes of data.
PacketType - Unreliable, Reliable, ReliableOrdered
Packet data is appended to NetworkDataBuffer, .
Messages are read out of NetworkDataBuffer.
Each message has an ACK id which upon receiving, you reply to your peer with a list of ACKs,
unacknowledged messages are re-sent in proceeding packets, up to N retries.
*/
void RunClient() {
CaveGame::Core::Generator* generator = new Generator(0);
CaveGame::Core::Chunk* chk = new Chunk({0, 5});
generator->FirstPass(chk);
std::cout << "Starting client thread." << std::endl;
const std::string IP = "localhost";
const uint16_t PORT = 42069;
UDPSocket<4096> udpSocket(true);
UDPSocket<32776> udpSocket(true);
udpSocket.Connect(IP, PORT);
udpSocket.Send("ping");
udpSocket.Send("poll");
udpSocket.Send("What happens if we send a stupidly long message? For example, a serialized chunk worth of tile data, would be at least 128^2 bytes, and much, much, much longer than this test message.\n So how do we accommodate for that? The buffer size parameter is a limiting factor, for one, but that is programmable. I also know of the MTU, and would like to see how far I can push it.\n Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.\nLorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.\n Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.\nLorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.\n Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.\nLorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.\n Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.\nLorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet.\n");
udpSocket.onRawMessageReceived = [&](const char* message, int length, std::string ipv4, uint16_t port)
{
std::cout << "client: " << ipv4 << ":" << port << " => " << message << "(" << length << ")" << std::endl;
udpSocket.onRawMessageReceived = [&](const char* message, int length, std::string ipv4, uint16_t port) {
Logs::Client(std::format("recv from"));
//std::cout << "received: " << ipv4 << ":" << port << " => " << message << "(" << length << ")" << std::endl;
};
udpSocket.Send("ping");
std::this_thread::sleep_for(10ms);
udpSocket.Send("poll");
std::this_thread::sleep_for(10ms);
for (int i = 0; i < 1000; i++)
{
udpSocket.Send(std::format("Sequence of messages in rapid succession {}/1000.", i+1));
if (i % 20 == 0)
std::this_thread::sleep_for(20ms);
}
Buffer test;
test.index = 0;
test.size = 512;
test.data = new uint8_t[384];
write_u8(test, 21);
write_string(test, "encoded-data");
write_u8(test, 7);
write_u8(test, 12);
write_u16(test, 32000);
write_u32(test, 666420);
write_u64(test, 420690000);
write_s8(test, -64);
write_f32(test, 3.14159f);
write_f16(test, 3.14159f);
write_string(test, "Tetsuo!.!.!..!!..!!");
udpSocket.Send((const char*)test.data, test.size);
std::this_thread::sleep_for(10ms);
test.index = 0;
test.size = 32776;
test.data = new uint8_t[32776];
chk->write(test);
uint8_t messages[33][1024];
for (int i = 0; i < 33; i++)
{
memcpy(&messages[i], (test.data+test.index)+(i*1024), 1024);
udpSocket.Send((const char*)messages[i], 1024);
}
//udpSocket.Send((const char*)test.data, test.size);
while (client_running) {
std::this_thread::sleep_for(10ms);
@@ -110,6 +214,47 @@ void RunClient() {
std::cout << "Client closing." << std::endl;
}
namespace Reliability {
struct Header {
uint16_t sequence; // A number that increases with each packet sent.
uint16_t ack; // The most recent packet sequence number received.
uint32_t ack_bits; // A bitfield encoding the set of acked packets.
};
const int BufferSize = 1024;
uint32_t sequence_buffer[BufferSize];
struct PacketData {
bool acked;
double send_time;
};
PacketData packet_data[BufferSize];
PacketData * GetPacketData(uint16_t sequence)
{
const int index = sequence % BufferSize;
if (sequence_buffer[index] == sequence)
return &packet_data[index];
else
return nullptr;
}
PacketData & InsertPacketData(uint16_t sequence)
{
const int index = sequence % BufferSize;
sequence_buffer[index] = sequence;
return packet_data[index];
}
struct Message {};
struct TestMessage : public Message
{
};
}
using namespace CaveGame::Core;
struct Header
@@ -164,67 +309,11 @@ public:
};
void rtt_f16(float input)
{
uint16_t intermediate = float_to_u16(input);
float returned = u16_to_float(intermediate);
std::cout << "Input: " << input << ", Output: " << returned << std::endl;
}
void roundtrip_test()
{
using namespace CaveGame::Core;
uint8_t a = 128;
uint16_t b = 32000;
uint32_t c = 666420;
uint64_t d = 42069666;
int8_t e = -64;
float f = 3.14159f;
std::string tetsuo = "Tetsuo!.!.!..!!..!!";
Buffer test;
test.index = 0;
test.size = 512;
test.data = new uint8_t[512];
write_u8(test, a);
write_u8(test, 12);
write_u16(test, b);
write_u32(test, c);
write_u64(test, d);
write_s8(test, e);
write_f16(test, f);
write_string(test, tetsuo);
test.index = 0;
uint8_t a_retrieved = read_u8(test);
a_retrieved = read_u8(test);
uint16_t b_retrieved = read_u16(test);
uint32_t c_retrieved = read_u32(test);
uint64_t d_retrieved = read_u64(test);
int8_t e_retrieved = read_s8(test);
float f_retrieved = read_f16(test);
rtt_f16(1.f);
rtt_f16(3.14159f);
rtt_f16(0.6666666666f);
rtt_f16(1.f / 3.f);
rtt_f16(99999.9f);
tetsuo = read_string(test);
std::cout << tetsuo << std::endl;
}
int main(int argc, char** argv) {
roundtrip_test();
Logs::Server.IncludeLocation(false);
Logs::Client.IncludeLocation(false);
std::cout << "Running Program" << std::endl;