diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-08-01 12:42:30 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-08-01 12:42:30 +0100 |
| commit | 8c7383df53c042ed79440e44ed7e1903aea20786 (patch) | |
| tree | f38779379c1965a3a3549a279c175b223a354381 /dev | |
| parent | b02fd28f77b01dee979a510b0c2ddff44f710de9 (diff) | |
feat: fix network container improvements.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/examples/fix/fix.cc | 11 | ||||
| -rw-r--r-- | dev/lib/fix/network.hpp | 41 |
2 files changed, 44 insertions, 8 deletions
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 <lib/fix/network.hpp> #include <lib/fix/parser.hpp> #include <iostream> +#include <unistd.h> +#include <sys/socket.h> /* finally test it */ int main(int argc, char** argv) { - snu::fix::visitor<char> visitor; - snu::fix::range_data<char> 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<char> visitor; + snu::fix::range_data<char> 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 <arpa/inet.h> #include <sys/socket.h> - #include <cstddef> 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 <typename T> 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 <int32_t PF, int32_t Kind, int32_t IPProto, int32_t Port> + 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 |
