src/Socket.cpp
branchv_0
changeset 28 f2697551bfd5
parent 27 e6e5780339bd
child 30 9fcd3ff6bd6e
equal deleted inserted replaced
27:e6e5780339bd 28:f2697551bfd5
   215 		// TODO: TCP receive()
   215 		// TODO: TCP receive()
   216 		return IncomingMessage("TODO: receive() a message");
   216 		return IncomingMessage("TODO: receive() a message");
   217 	}
   217 	}
   218 };
   218 };
   219 
   219 
       
   220 class TCPServerSocket : public Socket {
       
   221 private:
       
   222 	AddressInfos::AddressInfo localAddress;
       
   223 	FD socket;
       
   224 public:
       
   225 
       
   226 	TCPServerSocket(AddressInfos::AddressInfo localAddress) : localAddress(localAddress), socket(::socket(localAddress.ai->ai_family, localAddress.ai->ai_socktype, localAddress.ai->ai_protocol)) {
       
   227 	}
       
   228 
       
   229 	static std::shared_ptr<Socket> open(const SocketOptions& options) {
       
   230 		auto socket = openClientSocket<TCPServerSocket>(options, SOCK_STREAM, IPPROTO_TCP);
       
   231 		auto ai = socket->localAddress.ai;
       
   232 		int reuseAddr = true;
       
   233 		check(::setsockopt(socket->socket.getFD(), SOL_SOCKET, SO_REUSEADDR, &reuseAddr, sizeof (reuseAddr)), "setsockopt SO_REUSEADDR");
       
   234 		check(::bind(socket->socket.getFD(), ai->ai_addr, ai->ai_addrlen), "bind");
       
   235 		check(::listen(socket->socket.getFD(), 10), "listen"); // TODO: configurable backlog connection count?
       
   236 		return socket;
       
   237 	}
       
   238 
       
   239 	void send(const OutgoingMessage& message) override {
       
   240 		FD clientSocket(accept(socket.getFD(), nullptr, 0));
       
   241 		ssize_t written = ::write(clientSocket.getFD(), message.data.c_str(), message.data.size());
       
   242 		if (written != message.data.size()) throw std::logic_error("writing to the socket failed");
       
   243 		// TODO: partial writes, repeat
       
   244 	}
       
   245 
       
   246 	const IncomingMessage receive() override {
       
   247 		// TODO: TCP receive()
       
   248 		return IncomingMessage("TODO: receive() a message");
       
   249 	}
       
   250 };
       
   251 
   220 class SCTPClientSocket : public MSGSocket {
   252 class SCTPClientSocket : public MSGSocket {
   221 private:
   253 private:
   222 	AddressInfos::AddressInfo remoteAddress;
   254 	AddressInfos::AddressInfo remoteAddress;
   223 public:
   255 public:
   224 
   256 
   296 };
   328 };
   297 
   329 
   298 static std::vector<std::shared_ptr<SocketFactory>> factories
   330 static std::vector<std::shared_ptr<SocketFactory>> factories
   299 {
   331 {
   300 	std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (),
   332 	std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (),
   301 	std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPClientSocket >> (), // TODO: correct class
   333 	std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPServerSocket >> (),
   302 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (),
   334 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (),
   303 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
   335 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
   304 	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPClientSocket >> (),
   336 	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPClientSocket >> (),
   305 	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: do we need a stream-mode SCTP?
   337 	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class
   306 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDSClientSocket >> (),
   338 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDSClientSocket >> (),
   307 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
   339 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
   308 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDSClientSocket >> (), // TODO: correct class
   340 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDSClientSocket >> (), // TODO: correct class
   309 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
   341 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
   310 };
   342 };