From fa318825ef0404816728f733484caa1bc23afa53 Mon Sep 17 00:00:00 2001 From: hovertank3d Date: Fri, 14 Nov 2025 20:05:59 +0100 Subject: george droid --- include/net/conn.hpp | 90 ++++++++++++++++------------------------------------ 1 file changed, 27 insertions(+), 63 deletions(-) (limited to 'include/net/conn.hpp') diff --git a/include/net/conn.hpp b/include/net/conn.hpp index 95992ed..6f57293 100644 --- a/include/net/conn.hpp +++ b/include/net/conn.hpp @@ -9,15 +9,17 @@ #include #include "net/packet.hpp" +#include "util/io.hpp" namespace net { class conn { - int sock_fd; + io::serialized_io rw; sockaddr_in conn_addr; socklen_t conn_addr_size; - using handler_list = std::vector)>>; + using handler = std::function)>; + using handler_list = std::vector; std::array handlers; std::map netmodule_handlers; @@ -27,72 +29,20 @@ private: uint16_t packet_size; uint8_t id; - recv(packet_size); - recv(id); + rw.read(packet_size); + rw.read(id); return { id, packet_size - 3 }; } public: conn(int sock_fd, sockaddr_in conn_addr, socklen_t conn_addr_size) - : sock_fd(sock_fd) + : rw(io::file_io(sock_fd)) , conn_addr(conn_addr) , conn_addr_size(conn_addr_size) { } - ~conn() - { - close(sock_fd); - } - - ssize_t send(std::span data) - { - auto bytes = ::send(sock_fd, data.data(), data.size_bytes(), 0); - if (bytes < 0) { - throw std::runtime_error(strerror(errno)); - } - return bytes; - } - - template - ssize_t send(T t) - { - t = to_little(t); - auto bytes = ::send(sock_fd, &t, sizeof(T), 0); - if (bytes < 0) { - throw std::runtime_error(strerror(errno)); - } - return bytes; - } - - ssize_t recv(std::span data) - { - if (data.size_bytes() == 0) { - return 0; - } - - auto bytes = ::recv(sock_fd, data.data(), data.size_bytes(), 0); - if (bytes <= 0) { - throw std::runtime_error(strerror(errno)); - } - return bytes; - } - - template - ssize_t recv(T& t) - { - auto bytes = ::recv(sock_fd, &t, sizeof(T), 0); - if (bytes <= 0) { - throw std::runtime_error(strerror(errno)); - } - t = to_little(t); - if (bytes != sizeof(T)) { - throw std::runtime_error(strerror(errno)); - } - return bytes; - } - template void expect_packet(T& t) { @@ -101,11 +51,17 @@ public: if (len > 0) { std::vector payload(len); - recv(payload); + rw.read(payload); decode_packet(payload, t); } } + template + void reg_handler(int id, H h) + { + handlers[id].push_back(h); + } + template void reg_handler(H h) { @@ -133,13 +89,21 @@ public: template void send_packet(T p) { - auto payload = encode_packet(p); + send_packet(T::packet_id, encode_packet(p)); + } - send(int16_t(payload.size() + 3)); - send(T::packet_id); + void send_packet(uint8_t id, std::span payload) + { + std::vector packet_data; + auto buffer = io::serialized_io(io::buffered_io(packet_data)); + + buffer.write(int16_t(payload.size() + 3)); + buffer.write(id); if (payload.size() > 0) { - send(payload); + buffer.write(payload); } + + rw.write(packet_data); } bool handle_netmodule(std::span payload) @@ -170,7 +134,7 @@ public: } std::vector payload(len); - recv(payload); + rw.read(payload); // got netmodule if (id == 82) { -- cgit v1.2.3