# HG changeset patch # User František Kučera # Date 1660947603 -7200 # Node ID e6e5780339bdc30b6ee1bcfa38c03848bb245723 # Parent 07949ba141b74ee7f900105e3b2dbf604494608a introduce IncomingMessage and OutgoingMessage types diff -r 07949ba141b7 -r e6e5780339bd src/Socket.cpp --- a/src/Socket.cpp Thu Aug 18 22:42:42 2022 +0200 +++ b/src/Socket.cpp Sat Aug 20 00:20:03 2022 +0200 @@ -154,8 +154,8 @@ MSGSocket(int socket) : socket(socket) { } - void send(const std::string& message) { - sendmsg(message); + void send(const OutgoingMessage& message) { + sendmsg(message.data); } }; @@ -177,15 +177,15 @@ return socket; } - void send(const std::string& message) override { + void send(const OutgoingMessage& message) override { auto ai = remoteAddress.ai; - sendto(socket.getFD(), message.c_str(), message.size(), 0, ai->ai_addr, ai->ai_addrlen); + sendto(socket.getFD(), message.data.c_str(), message.data.size(), 0, ai->ai_addr, ai->ai_addrlen); if (delay) usleep(delay); } - const std::string receive() override { + const IncomingMessage receive() override { // TODO: UDP receive() - return "TODO: receive() a message"; + return IncomingMessage("TODO: receive() a message"); } }; @@ -202,18 +202,18 @@ return openClientSocket(options, SOCK_STREAM, IPPROTO_TCP); } - void send(const std::string& message) override { + void send(const OutgoingMessage& message) override { auto ai = remoteAddress.ai; FD s(::socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)); check(::connect(s.getFD(), ai->ai_addr, ai->ai_addrlen), "connect socket"); - ssize_t written = ::write(s.getFD(), message.c_str(), message.size()); - if (written != message.size()) throw std::logic_error("writing to the socket failed"); + ssize_t written = ::write(s.getFD(), message.data.c_str(), message.data.size()); + if (written != message.data.size()) throw std::logic_error("writing to the socket failed"); // TODO: partial writes, repeat } - const std::string receive() override { + const IncomingMessage receive() override { // TODO: TCP receive() - return "TODO: receive() a message"; + return IncomingMessage("TODO: receive() a message"); } }; @@ -231,9 +231,9 @@ return socket; } - const std::string receive() override { + const IncomingMessage receive() override { // TODO: SCTP receive() - return "TODO: receive() a message"; + return IncomingMessage("TODO: receive() a message"); } }; @@ -274,9 +274,9 @@ return socket; } - const std::string receive() override { + const IncomingMessage receive() override { // TODO: UDS receive() - return "TODO: receive() a message"; + return IncomingMessage("TODO: receive() a message"); } }; @@ -302,9 +302,7 @@ std::make_shared> (), std::make_shared> (), // TODO: correct class std::make_shared> (), - std::make_shared> (), std::make_shared> (), // TODO: do we need a stream-mode SCTP? - std::make_shared> (), // TODO: correct class std::make_shared> (), std::make_shared> (), // TODO: correct class std::make_shared> (), // TODO: correct class diff -r 07949ba141b7 -r e6e5780339bd src/Socket.h --- a/src/Socket.h Thu Aug 18 22:42:42 2022 +0200 +++ b/src/Socket.h Sat Aug 20 00:20:03 2022 +0200 @@ -51,11 +51,47 @@ static const char MODE_DATAGRAM[] = "datagram"; } +class Message { +public: + std::string data; + + Message() { + } + + Message(const std::string& data) : data(data) { + } + + virtual ~Message() = default; + + +}; + +class IncomingMessage : public Message { +public: + + IncomingMessage(const std::string& data) : Message(data) { + } + +}; + +class OutgoingMessage : public Message { +public: + + OutgoingMessage(const std::string& data) : Message(data) { + } + + std::string remoteHost; + std::string remotePort; + pid_t remotePID; + uid_t remoteUID; + gid_t remoteGID; +}; + class Socket { public: virtual ~Socket() = default; - virtual void send(const std::string& message) = 0; - virtual const std::string receive() = 0; + virtual void send(const OutgoingMessage& message) = 0; + virtual const IncomingMessage receive() = 0; }; class SocketOption {