SCTP: sendmsg() only v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Thu, 18 Aug 2022 03:43:19 +0200
branchv_0
changeset 23 4d97d58d40df
parent 22 9a7c42cca24b
child 24 b668bd88ffa2
SCTP: sendmsg() only
src/Socket.cpp
--- a/src/Socket.cpp	Thu Aug 18 03:39:55 2022 +0200
+++ b/src/Socket.cpp	Thu Aug 18 03:43:19 2022 +0200
@@ -191,47 +191,18 @@
 	}
 };
 
-class SCTPStreamClientSocket : public Socket {
-private:
-	AddressInfos::AddressInfo remoteAddress;
-
-public:
-
-	SCTPStreamClientSocket(AddressInfos::AddressInfo remoteAddress) : remoteAddress(remoteAddress) {
-	}
-
-	static std::shared_ptr<Socket> open(const SocketOptions& options) {
-		auto socket = openClientSocket<SCTPStreamClientSocket>(options, SOCK_STREAM, IPPROTO_SCTP);
-		return socket;
-	}
-
-	void send(const std::string& 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");
-		// TODO: partial writes, repeat
-	}
-
-	const std::string receive() override {
-		// TODO: SCTP receive()
-		return "TODO: receive() a message";
-	}
-};
-
-class SCTPMessageClientSocket : public Socket {
+class SCTPClientSocket : public Socket {
 private:
 	AddressInfos::AddressInfo remoteAddress;
 	FD socket;
 
 public:
 
-	SCTPMessageClientSocket(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), socket(::socket(remoteAddress.ai->ai_family, remoteAddress.ai->ai_socktype, remoteAddress.ai->ai_protocol)) {
 	}
 
 	static std::shared_ptr<Socket> open(const SocketOptions& options) {
-		auto socket = openClientSocket<SCTPMessageClientSocket>(options, SOCK_STREAM, IPPROTO_SCTP);
+		auto socket = openClientSocket<SCTPClientSocket>(options, SOCK_STREAM, IPPROTO_SCTP);
 		check(::connect(socket->socket.getFD(), socket->remoteAddress.ai->ai_addr, socket->remoteAddress.ai->ai_addrlen), "connect socket");
 		return socket;
 	}
@@ -240,12 +211,11 @@
 		iovec iov[1];
 		msghdr msg = {};
 		msg.msg_iov = iov;
-		msg.msg_iov[0].iov_base = (void*) message.c_str(); // TODO: const?
+		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");
-		// TODO: partial writes, repeat
 	}
 
 	const std::string receive() override {
@@ -275,8 +245,8 @@
 			std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPClientSocket >> (), // TODO: correct class
 			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, SCTPStreamClientSocket >> (), // TODO: do we need a stream-mode SCTP?
-			std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_DATAGRAM, SCTPMessageClientSocket >> (),
+			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, UDPClientSocket >> (), // TODO: correct class