summaryrefslogtreecommitdiffhomepage
path: root/dev/lib/fix
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 /dev/lib/fix
parentb02fd28f77b01dee979a510b0c2ddff44f710de9 (diff)
feat: fix network container improvements.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev/lib/fix')
-rw-r--r--dev/lib/fix/network.hpp41
1 files changed, 36 insertions, 5 deletions
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