src/Socket.cpp
branchv_0
changeset 22 9a7c42cca24b
parent 21 1c6c86697837
child 23 4d97d58d40df
equal deleted inserted replaced
21:1c6c86697837 22:9a7c42cca24b
   218 		// TODO: SCTP receive()
   218 		// TODO: SCTP receive()
   219 		return "TODO: receive() a message";
   219 		return "TODO: receive() a message";
   220 	}
   220 	}
   221 };
   221 };
   222 
   222 
       
   223 class SCTPMessageClientSocket : public Socket {
       
   224 private:
       
   225 	AddressInfos::AddressInfo remoteAddress;
       
   226 	FD socket;
       
   227 
       
   228 public:
       
   229 
       
   230 	SCTPMessageClientSocket(AddressInfos::AddressInfo remoteAddress) : remoteAddress(remoteAddress), socket(::socket(remoteAddress.ai->ai_family, remoteAddress.ai->ai_socktype, remoteAddress.ai->ai_protocol)) {
       
   231 	}
       
   232 
       
   233 	static std::shared_ptr<Socket> open(const SocketOptions& options) {
       
   234 		auto socket = openClientSocket<SCTPMessageClientSocket>(options, SOCK_STREAM, IPPROTO_SCTP);
       
   235 		check(::connect(socket->socket.getFD(), socket->remoteAddress.ai->ai_addr, socket->remoteAddress.ai->ai_addrlen), "connect socket");
       
   236 		return socket;
       
   237 	}
       
   238 
       
   239 	void send(const std::string& message) override {
       
   240 		iovec iov[1];
       
   241 		msghdr msg = {};
       
   242 		msg.msg_iov = iov;
       
   243 		msg.msg_iov[0].iov_base = (void*) message.c_str(); // TODO: const?
       
   244 		msg.msg_iov[0].iov_len = message.size();
       
   245 		msg.msg_iovlen = sizeof (iov) / sizeof (iov[0]);
       
   246 		ssize_t written = ::sendmsg(socket.getFD(), &msg, 0);
       
   247 		if (written != message.size()) throw std::logic_error("writing to the socket failed");
       
   248 		// TODO: partial writes, repeat
       
   249 	}
       
   250 
       
   251 	const std::string receive() override {
       
   252 		// TODO: SCTP receive()
       
   253 		return "TODO: receive() a message";
       
   254 	}
       
   255 };
       
   256 
   223 template<const char* protocol, const char* role, const char* mode, typename SocketClass>
   257 template<const char* protocol, const char* role, const char* mode, typename SocketClass>
   224 class TemplateSocketFactory : public SocketFactory {
   258 class TemplateSocketFactory : public SocketFactory {
   225 public:
   259 public:
   226 
   260 
   227 	bool canHandle(const SocketOptions& options) override {
   261 	bool canHandle(const SocketOptions& options) override {
   240 	std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (),
   274 	std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (),
   241 			std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPClientSocket >> (), // TODO: correct class
   275 			std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPClientSocket >> (), // TODO: correct class
   242 			std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (),
   276 			std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (),
   243 			std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
   277 			std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
   244 			std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPStreamClientSocket >> (), // TODO: do we need a stream-mode SCTP?
   278 			std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPStreamClientSocket >> (), // TODO: do we need a stream-mode SCTP?
   245 			std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_DATAGRAM, SCTPStreamClientSocket >> (),
   279 			std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_DATAGRAM, SCTPMessageClientSocket >> (),
   246 			std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: do we need a stream-mode SCTP?
   280 			std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: do we need a stream-mode SCTP?
   247 			std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
   281 			std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
   248 			std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class
   282 			std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class
   249 			std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
   283 			std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
   250 			std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class
   284 			std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class