# HG changeset patch # User František Kučera # Date 1660853615 -7200 # Node ID de58479757e1386e806361421e60fefc72845de9 # Parent b668bd88ffa231ebe9d04b56005f8389c6bb9bc4 introduce common parent class MSGSocket for sockets using sendmsg() diff -r b668bd88ffa2 -r de58479757e1 src/Socket.cpp --- a/src/Socket.cpp Thu Aug 18 18:08:39 2022 +0200 +++ b/src/Socket.cpp Thu Aug 18 22:13:35 2022 +0200 @@ -135,16 +135,30 @@ return std::shared_ptr(new SocketClass(remoteAddresses[0], moreArgs...)); } -void sendmsg(int fd, const std::string& message) { - iovec iov[1]; - msghdr msg = {}; - msg.msg_iov = iov; - msg.msg_iov[0].iov_base = (void*) message.c_str(); - msg.msg_iov[0].iov_len = message.size(); - msg.msg_iovlen = sizeof (iov) / sizeof (iov[0]); - ssize_t written = ::sendmsg(fd, &msg, 0); - if (written != message.size()) throw std::logic_error("writing to the socket failed"); -} +class MSGSocket : public Socket { +protected: + FD socket; + + void sendmsg(const std::string& message) { + iovec iov[1]; + msghdr msg = {}; + msg.msg_iov = iov; + msg.msg_iov[0].iov_base = (void*) message.c_str(); + msg.msg_iov[0].iov_len = message.size(); + msg.msg_iovlen = sizeof (iov) / sizeof (iov[0]); + ssize_t written = ::sendmsg(socket.getFD(), &msg, 0); + if (written != message.size()) throw std::logic_error("writing to the socket failed"); + } +public: + + MSGSocket(int socket) : socket(socket) { + } + + void send(const std::string& message) { + sendmsg(message); + } + +}; class UDPClientSocket : public Socket { private: @@ -203,14 +217,12 @@ } }; -class SCTPClientSocket : public Socket { +class SCTPClientSocket : public MSGSocket { private: AddressInfos::AddressInfo remoteAddress; - FD socket; - public: - SCTPClientSocket(AddressInfos::AddressInfo remoteAddress) : remoteAddress(remoteAddress), socket(::socket(remoteAddress.ai->ai_family, remoteAddress.ai->ai_socktype, remoteAddress.ai->ai_protocol)) { + SCTPClientSocket(AddressInfos::AddressInfo remoteAddress) : remoteAddress(remoteAddress), MSGSocket(::socket(remoteAddress.ai->ai_family, remoteAddress.ai->ai_socktype, remoteAddress.ai->ai_protocol)) { } static std::shared_ptr open(const SocketOptions& options) { @@ -219,23 +231,16 @@ return socket; } - void send(const std::string& message) override { - sendmsg(socket.getFD(), message); - } - const std::string receive() override { // TODO: SCTP receive() return "TODO: receive() a message"; } }; -class UDSClientSocket : public Socket { -private: - FD socket; - +class UDSClientSocket : public MSGSocket { public: - UDSClientSocket(int fd) : socket(fd) { + UDSClientSocket(int fd) : MSGSocket(fd) { } static std::shared_ptr open(const SocketOptions& options) { @@ -274,7 +279,7 @@ } void send(const std::string& message) override { - sendmsg(socket.getFD(), message); + sendmsg(message); } const std::string receive() override {