summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-08-01 12:42:30 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2025-08-01 12:42:30 +0100
commit8c7383df53c042ed79440e44ed7e1903aea20786 (patch)
treef38779379c1965a3a3549a279c175b223a354381
parentb02fd28f77b01dee979a510b0c2ddff44f710de9 (diff)
feat: fix network container improvements.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
-rw-r--r--dev/examples/fix/fix.cc11
-rw-r--r--dev/lib/fix/network.hpp41
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