diff options
author | Roman Smrž <roman.smrz@seznam.cz> | 2023-08-12 17:53:08 +0200 |
---|---|---|
committer | Roman Smrž <roman.smrz@seznam.cz> | 2023-08-12 17:56:57 +0200 |
commit | 7420a170928da75cb860e3fc8804416babdeec8c (patch) | |
tree | b8534f8735e770ba99683c02f06a5c126526b5a7 /src/network | |
parent | 07286e80ddc3d0e448401a4432dc88d4df7c7387 (diff) |
New class for network protocol implementation
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/protocol.cpp | 69 | ||||
-rw-r--r-- | src/network/protocol.h | 33 |
2 files changed, 102 insertions, 0 deletions
diff --git a/src/network/protocol.cpp b/src/network/protocol.cpp new file mode 100644 index 0000000..63cfde5 --- /dev/null +++ b/src/network/protocol.cpp @@ -0,0 +1,69 @@ +#include "protocol.h" + +#include <sys/socket.h> +#include <unistd.h> + +#include <system_error> + +namespace erebos { + +NetworkProtocol::NetworkProtocol(): + sock(-1) +{} + +NetworkProtocol::NetworkProtocol(int s): + sock(s) +{} + +NetworkProtocol::NetworkProtocol(NetworkProtocol && other): + sock(other.sock) +{ + other.sock = -1; +} + +NetworkProtocol & NetworkProtocol::operator=(NetworkProtocol && other) +{ + sock = other.sock; + other.sock = -1; + return *this; +} + +NetworkProtocol::~NetworkProtocol() +{ + if (sock >= 0) + close(sock); +} + +bool NetworkProtocol::recvfrom(vector<uint8_t> & buffer, sockaddr_in6 & addr) +{ + socklen_t addrlen = sizeof(addr); + buffer.resize(4096); + ssize_t ret = ::recvfrom(sock, buffer.data(), buffer.size(), 0, + (sockaddr *) &addr, &addrlen); + if (ret < 0) + throw std::system_error(errno, std::generic_category()); + if (ret == 0) + return false; + + buffer.resize(ret); + return true; +} + +void NetworkProtocol::sendto(const vector<uint8_t> & buffer, sockaddr_in addr) +{ + ::sendto(sock, buffer.data(), buffer.size(), 0, + (sockaddr *) &addr, sizeof(addr)); +} + +void NetworkProtocol::sendto(const vector<uint8_t> & buffer, sockaddr_in6 addr) +{ + ::sendto(sock, buffer.data(), buffer.size(), 0, + (sockaddr *) &addr, sizeof(addr)); +} + +void NetworkProtocol::shutdown() +{ + ::shutdown(sock, SHUT_RDWR); +} + +} diff --git a/src/network/protocol.h b/src/network/protocol.h new file mode 100644 index 0000000..6a22f3b --- /dev/null +++ b/src/network/protocol.h @@ -0,0 +1,33 @@ +#pragma once + +#include <netinet/in.h> + +#include <cstdint> +#include <vector> + +namespace erebos { + +using std::vector; + +class NetworkProtocol +{ +public: + NetworkProtocol(); + explicit NetworkProtocol(int sock); + NetworkProtocol(const NetworkProtocol &) = delete; + NetworkProtocol(NetworkProtocol &&); + NetworkProtocol & operator=(const NetworkProtocol &) = delete; + NetworkProtocol & operator=(NetworkProtocol &&); + ~NetworkProtocol(); + + bool recvfrom(vector<uint8_t> & buffer, sockaddr_in6 & addr); + void sendto(const vector<uint8_t> & buffer, sockaddr_in addr); + void sendto(const vector<uint8_t> & buffer, sockaddr_in6 addr); + + void shutdown(); + +private: + int sock; +}; + +} |