--- 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<SocketClass>(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<Socket> 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<Socket> 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 {