introduce common parent class MSGSocket for sockets using sendmsg() v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Thu, 18 Aug 2022 22:13:35 +0200
branchv_0
changeset 25 de58479757e1
parent 24 b668bd88ffa2
child 26 07949ba141b7
introduce common parent class MSGSocket for sockets using sendmsg()
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<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 {