From 8c7383df53c042ed79440e44ed7e1903aea20786 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 1 Aug 2025 12:42:30 +0100 Subject: feat: fix network container improvements. Signed-off-by: Amlal El Mahrouss --- dev/examples/fix/fix.cc | 11 ++++++++--- dev/lib/fix/network.hpp | 41 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 8 deletions(-) (limited to 'dev') diff --git a/dev/examples/fix/fix.cc b/dev/examples/fix/fix.cc index 620d7d6..86838bb 100644 --- a/dev/examples/fix/fix.cc +++ b/dev/examples/fix/fix.cc @@ -1,17 +1,22 @@ -/* +/* fix example written by Amlal El Mahrouss. licensed under the MIT license */ +#include #include #include +#include +#include /* finally test it */ int main(int argc, char** argv) { - snu::fix::visitor visitor; - snu::fix::range_data fix = visitor.visit("8=FIX.4.2|9=65|35=A|49=SERVER|56=CLIENT|34=177|52=20090107-18:15:16|98=0|108=30|10=062|"); + constexpr auto default_fix = "8=FIX.4.2|9=65|35=A|49=SERVER|56=CLIENT|34=177|52=20090107-18:15:16|98=0|108=30|10=062|"; + + snu::fix::visitor visitor; + snu::fix::range_data fix = visitor.visit(default_fix); std::cout << "magic: " << fix.magic_ << std::endl; std::cout << "is_valid: " << std::boolalpha << fix.is_valid() << std::endl; diff --git a/dev/lib/fix/network.hpp b/dev/lib/fix/network.hpp index dce6b63..abdb00a 100644 --- a/dev/lib/fix/network.hpp +++ b/dev/lib/fix/network.hpp @@ -10,7 +10,6 @@ #include #include - #include namespace snu::fix @@ -29,16 +28,23 @@ namespace snu::fix delivery_modem& operator=(const delivery_modem&) = default; delivery_modem(const delivery_modem&) = default; + static constexpr auto local_address = "127.0.0.1"; + static constexpr auto backlog_cnt = 18U; + public: delivery_socket_type fd_{}; template bool receive(T& out, std::size_t len) noexcept { + if (!out) + return false; + if (!len) return false; - auto ret = ::recv(fd_, &out, len, 0); + auto ret = ::recv(fd_, out, len, MSG_WAITALL); + return ret > 0; } @@ -47,17 +53,42 @@ namespace snu::fix { if (!out) return false; + if (!len) return false; auto ret = ::send(fd_, out, len, 0); + return ret > 0; } - bool construct() noexcept + template + bool construct(const char* addr = local_address, const bool& is_server = false) noexcept { - fd_ = ::socket(SOCK_STREAM, AF_INET, 0); - return fd_ > 0; + static_assert(Kind != 0, "Kind is zero"); + static_assert(IPProto != 0, "IPProto is zero"); + + fd_ = ::socket(PF, Kind, IPProto); + + if (fd_ < 1) + return false; + + struct sockaddr_in addr_ + { + }; + + addr_.sin_addr.s_addr = ::inet_addr(addr); + addr_.sin_port = Port; + + if (!is_server) + { + auto ret = ::connect(fd_, (struct sockaddr*)&addr_, sizeof(decltype(addr_))); + return ret == 0; + } + + ::listen(fd_, backlog_cnt); + + return true; } bool destroy() noexcept -- cgit v1.2.3