TCPServer impl

This commit is contained in:
2024-09-18 16:31:09 -04:00
parent 8f0fedd469
commit ad365c7b19

277
main.cpp
View File

@@ -7,6 +7,8 @@
#include "Sockets/UdpSocket.hpp"
#include <Sockets/Endianness.hpp>
#include <jlog/Logger.hpp>
#include <Event.h>
#include <EventConnection.h>
class ServerLogger {
private:
@@ -38,107 +40,218 @@ public:
using namespace Socket;
/// Spins up a TCP server, listens for connections, and echoes input directly back to the client.
/// While running this function, use the terminal program netcat to connect and send messages:
/// nc localhost 40269
void TCP_ReceiveTest()
{
ServerLogger TCPLogger;
class TCPServer {
public:
ServerLogger logger;
using Socket_p = std::shared_ptr<TcpSocket>;
Socket_p sock(new TcpSocket);
//Event<Socket_p> OnServe;
Event<Socket_p> OnAccept;
Event<Socket_p> OnRX;
Event<Socket_p> OnTX;
Socket_p sock {new TcpSocket};
Socket_p client;
public:
TCPServer() {};
public:
virtual void Serve() {
try {
sock->Bind(42069);
sock->Listen(5);
client = sock->Accept();
Accept();
} catch(std::exception &e) {
std::cout << e.what() << std::endl;
return;
}
try {
sock->Bind(42069);
sock->Listen(5);
client = sock->Accept();
} catch(std::exception &e) {
std::cout << e.what() << std::endl;
return;
}
// Welcoming the new users
std::string payload = "Welcome!\n\f";
// Welcoming the new users
//std::string payload = "Welcome!\n\f";
client->Send(reinterpret_cast<const u8 *>(payload.data()), payload.size(), 0);
// Closing the listening socket, we want nobody else.
sock->Close();
//client->Send(reinterpret_cast<const u8 *>(payload.data()), payload.size(), 0);
// Closing the listening socket, we want nobody else.
//sock->Close();
u8 data[512];
memset(&data, 0, 512);
while (client->Receive(data, sizeof data, 0))
{
//std::cout << "[Recv] " << data << std::endl;
//std::string datastr = reinterpret_cast<char*>(data);
TCPLogger.RX(reinterpret_cast<char*>(data));
client->Send(data, sizeof data, 0);
TCPLogger.TX(reinterpret_cast<char*>(data));
/*
u8 data[512];
memset(&data, 0, 512);
while (client->Receive(data, sizeof data, 0))
{
logger.RX(reinterpret_cast<char*>(data));
client->Send(data, sizeof data, 0);
logger.TX(reinterpret_cast<char*>(data));
memset(&data, 0, 512);
}
*/
//OnRX(client);
//OnTX(client);
//client->Close();
};
virtual void Accept() { OnAccept(client); }
virtual void RX() { OnRX(client); };
virtual void TX() { OnTX(client); };
};
class MProtoServer : public TCPServer {
public:
enum MsgID : uint8_t {
THandShake = 100,
RHandShake = 101,
};
MProtoServer() : TCPServer() {};
void Accept() {
sock->Close();
u8 data[7];
memset(&data, 0, 1);
while (client->Receive(data, sizeof data, 0)) {
//logger.RX(reinterpret_cast<char *>(data));
//client->Send(data, sizeof data, 0);
//logger.TX(reinterpret_cast<char *>(data));
std::cout << std::to_string(data[7]) << std::endl;
if (uint8_t(data[1]) == THandShake) {
logger.RX("THandShake");
}
memset(&data, 0, 1);
}
client->Close();
//uint16_t wd = (data[2] << 8) | data[1];
};
/// Spins up a TCP server, listens for connections, and echoes input directly back to the client.
/// While running this function, use the terminal program netcat to connect and send messages:
/// nc localhost 40269
void TCP_ReceiveTest() {
ServerLogger TCPLogger;
using Socket_p = std::shared_ptr<TcpSocket>;
Socket_p sock(new TcpSocket);
Socket_p client;
try {
sock->Bind(42069);
sock->Listen(5);
client = sock->Accept();
} catch (std::exception &e) {
std::cout << e.what() << std::endl;
return;
}
// Welcoming the new users
std::string payload = "Welcome!\n\f";
client->Send(reinterpret_cast<const u8 *>(payload.data()), payload.size(), 0);
// Closing the listening socket, we want nobody else.
sock->Close();
u8 data[512];
memset(&data, 0, 512);
while (client->Receive(data, sizeof data, 0)) {
//std::cout << "[Recv] " << data << std::endl;
//std::string datastr = reinterpret_cast<char*>(data);
TCPLogger.RX(reinterpret_cast<char *>(data));
client->Send(data, sizeof data, 0);
TCPLogger.TX(reinterpret_cast<char *>(data));
memset(&data, 0, 512);
}
client->Close();
}
client->Close();
}
void UDP_ReceiveTest()
{
using UdpSocket_p = std::shared_ptr<UdpSocket>;
void UDP_ReceiveTest() {
using UdpSocket_p = std::shared_ptr<UdpSocket>;
UdpSocket_p sock (new UdpSocket);
UdpSocket_p sock(new UdpSocket);
try
try {
sock->Open();
sock->Bind(42575);
} catch (const std::exception &e) {
std::cout << e.what() << std::endl;
return;
}
UdpSocket_p client(new UdpSocket);
try {
client->Open();
client->Connect(42575);
std::string payload = "bruh";
client->Send(reinterpret_cast<const u8 *>(payload.data()), payload.size());
//client->SendTo(IPAddress::Loopback(42575), reinterpret_cast<const u8 *>(payload.data()), payload.size(), 0);
//client->BindAny();
//client->Open();
//client->Connect(sock->GetSelfIP());
} catch (const std::exception &e) {
std::cout << e.what() << std::endl;
return;
}
client->Close();
sock->Close();
}
};
int main(int argc, char *argv[])
{
sock->Open();
sock->Bind(42575);
} catch(const std::exception& e) {
std::cout << e.what() << std::endl;
return;
}
if (Socket::Endianness::IsBigEndian())
std::cout << "Big Endian" << std::endl;
UdpSocket_p client (new UdpSocket);
try {
client->Open();
client->Connect(42575);
std::string payload = "bruh";
client->Send(reinterpret_cast<const u8 *>(payload.data()), payload.size());
//client->SendTo(IPAddress::Loopback(42575), reinterpret_cast<const u8 *>(payload.data()), payload.size(), 0);
//client->BindAny();
//client->Open();
//client->Connect(sock->GetSelfIP());
} catch(const std::exception& e) {
std::cout << e.what() << std::endl;
return;
}
client->Close();
if (Socket::Endianness::IsLittleEndian())
std::cout << "Little Endian" << std::endl;
sock->Close();
}
float val = 420.5f;
float a = Socket::Endianness::HostToNetworkOrder(val);
a = Socket::Endianness::NetworkToHostOrder(a);
int main(int argc, char *argv[])
{
if (Socket::Endianness::IsBigEndian())
std::cout << "Big Endian" << std::endl;
std::cout << a << std::endl;
if (Socket::Endianness::IsLittleEndian())
std::cout << "Little Endian" << std::endl;
//TCP_ReceiveTest();
//UDP_ReceiveTest();
TCPServer server;
server.OnAccept += [&] (TCPServer::Socket_p s) {
server.logger.RX("Accepted client");
server.RX();
};
float val = 420.5f;
float a = Socket::Endianness::HostToNetworkOrder(val);
a = Socket::Endianness::NetworkToHostOrder(a);
std::cout << a << std::endl;
TCP_ReceiveTest();
//UDP_ReceiveTest();
return 0;
}
server.OnRX += [&] (TCPServer::Socket_p s) {
u8 data[512];
memset(&data, 0, 512);
while (s->Receive(data, sizeof data, 0))
{
server.logger.RX(reinterpret_cast<char*>(data));
//s->Send(data, sizeof data, 0);
//server.logger.TX(reinterpret_cast<char*>(data));
server.TX();
memset(&data, 0, 512);
}
};
server.OnTX += [&] (TCPServer::Socket_p s) {
std::string pong = "Message recieved";
u8 data[512];
memset(&data, 0, 512);
std::copy(pong.begin(), pong.end(), std::begin(data));
s->Send(data, sizeof(data), 0);
server.logger.TX(pong);
memset(&data, 0, 512);
};
server.Serve();
//MProtoServer ms;
//ms.Serve();
return 0;
}