30 explicit TcpPosixAdapter(uint16_t listenPort,
const char* targetIp =
nullptr, uint16_t targetPort = 0);
33 bool SendBytes(
const uint8_t* data, std::size_t length)
override;
34 std::size_t
ReceiveChunk(uint8_t* buffer, std::size_t maxLength)
override;
36 bool IsValid()
const {
return m_socket >= 0 || (!m_isServer && m_peerAddrValid); }
37 bool IsConnected()
const {
return m_isConnected && m_handshakeComplete; }
47 bool CreateBaseSocket();
48 bool ConfigureSocket(
int sock);
49 void BeginClientConnect(
bool forceImmediate);
50 void PollConnection();
51 void HandleConnectionLoss();
52 void TryFlushTxBuffer(
int targetSock);
53 bool EnqueueTx(
const uint8_t* data, std::size_t length);
55 void LogError(
const char* message);
56 bool ProcessHandshake(
const uint8_t* data, std::size_t length);
57 uint32_t GetExpectedSchemaHash()
const;
60 int m_clientSocket{-1};
61 bool m_isServer{
false};
62 bool m_isConnected{
false};
63 bool m_connectInProgress{
false};
64 bool m_handshakeComplete{
false};
65 bool m_handshakeSent{
false};
66 bool m_schemaValidated{
false};
67 uint32_t m_remoteSchemaHash{0};
68 uint32_t m_expectedSchemaHash{0};
69 sockaddr_in m_peerAddr{};
70 bool m_peerAddrValid{
false};
71 std::chrono::steady_clock::time_point m_nextReconnectAttempt{};
72 std::chrono::steady_clock::time_point m_lastServerRx{};
73 std::chrono::milliseconds m_serverClientTimeout{5000};
75 static constexpr std::size_t kMaxPacketSize = 65536;
76 static constexpr std::size_t kTxBufferCapacity = kMaxPacketSize * 8;
77 std::unique_ptr<uint8_t[]> m_txBuffer;
78 std::size_t m_txHead{0};
79 std::size_t m_txTail{0};
80 std::size_t m_txSize{0};
81 std::chrono::steady_clock::time_point m_lastErrorLog{};
85 std::size_t m_handshakeReceived{0};