introduce IncomingMessage and OutgoingMessage types v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sat, 20 Aug 2022 00:20:03 +0200
branchv_0
changeset 27 e6e5780339bd
parent 26 07949ba141b7
child 28 f2697551bfd5
introduce IncomingMessage and OutgoingMessage types
src/Socket.cpp
src/Socket.h
--- 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<TCPClientSocket>(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<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (),
 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
 	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPClientSocket >> (),
-	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_DATAGRAM, SCTPClientSocket >> (),
 	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: do we need a stream-mode SCTP?
-	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDSClientSocket >> (),
 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDSClientSocket >> (), // TODO: correct class
--- 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 {