#pragma once #include "ErrorCodes.hpp" #include "LoggerService.hpp" // TcpBase contains common tcp I/O operations for the tcp client and tcp server // Abstracts away the networking methods into an accordion common protocol (ACP) class TcpBase { public: TcpBase(LoggerService* logger); ~TcpBase(); // read from a tcp socket, blocking ssize_t tcpRead(int fd, void* buffer, size_t maxBytes); // read from a tcp socket, blocking with timeout ssize_t tcpTimedRead(int fd, void* buffer, size_t maxBytes, int timeoutPlaceholder); // send over a tcp socket, blocking ssize_t tcpSend(int fd, const void* buffer, size_t numBytes); // send over a tcp socket, blocking with timeout ssize_t tcpTimedSend(int fd, const void* buffer, size_t numBytes, int timeoutPlaceholder); protected: LoggerService* logger_; private: ssize_t receiveHeader(int fd, void* buffer, size_t maxBytes); ssize_t receivePayload(int fd, void* buffer, size_t maxBytes); ssize_t sendHeader(int fd, const void* buffer, size_t maxBytes); ssize_t sendPayload(int fd, const void* buffer, size_t maxBytes); ssize_t receiveFull(int fd, void* buffer, size_t maxBytes); ssize_t sendFull(int fd, const void* buffer, size_t numBytes); static constexpr size_t kHeaderSize = 8; // 4 bytes for length, 4 bytes for type };