src/Socket.cpp
branchv_0
changeset 30 9fcd3ff6bd6e
parent 28 f2697551bfd5
child 31 17cea3a6d33f
equal deleted inserted replaced
29:97fe991ad2cb 30:9fcd3ff6bd6e
   187 		// TODO: UDP receive()
   187 		// TODO: UDP receive()
   188 		return IncomingMessage("TODO: receive() a message");
   188 		return IncomingMessage("TODO: receive() a message");
   189 	}
   189 	}
   190 };
   190 };
   191 
   191 
       
   192 class UDPServerSocket : public Socket {
       
   193 private:
       
   194 	AddressInfos::AddressInfo localAddress;
       
   195 	sockaddr_in6 remoteAddress = {};
       
   196 	useconds_t delay = 0;
       
   197 	FD socket;
       
   198 
       
   199 public:
       
   200 
       
   201 	UDPServerSocket(AddressInfos::AddressInfo remoteAddress) : localAddress(remoteAddress), socket(::socket(remoteAddress.ai->ai_family, remoteAddress.ai->ai_socktype, remoteAddress.ai->ai_protocol)) {
       
   202 	}
       
   203 
       
   204 	static std::shared_ptr<Socket> open(const SocketOptions& options) {
       
   205 		auto socket = openClientSocket<UDPServerSocket>(options, SOCK_DGRAM, IPPROTO_UDP);
       
   206 		auto ai = socket->localAddress.ai;
       
   207 		int reuseAddr = true;
       
   208 		check(::setsockopt(socket->socket.getFD(), SOL_SOCKET, SO_REUSEADDR, &reuseAddr, sizeof (reuseAddr)), "setsockopt SO_REUSEADDR");
       
   209 		check(::bind(socket->socket.getFD(), ai->ai_addr, ai->ai_addrlen), "bind");
       
   210 		return socket;
       
   211 	}
       
   212 
       
   213 	void send(const OutgoingMessage& message) override {
       
   214 		// receive a message first to get a remote address:
       
   215 		char buffer[8192];
       
   216 		memset((char *) &remoteAddress, 0, sizeof (remoteAddress));
       
   217 		socklen_t remoteAddressSize = sizeof (remoteAddress);
       
   218 		ssize_t msgSize = recvfrom(socket.getFD(), buffer, sizeof (buffer), 0, (sockaddr*) & remoteAddress, &remoteAddressSize);
       
   219 
       
   220 		// respond with our messsage:
       
   221 		sendto(socket.getFD(), message.data.c_str(), message.data.size(), 0, (sockaddr*) & remoteAddress, remoteAddressSize);
       
   222 	}
       
   223 
       
   224 	const IncomingMessage receive() override {
       
   225 		// TODO: UDP receive()
       
   226 		return IncomingMessage("TODO: receive() a message");
       
   227 	}
       
   228 };
       
   229 
   192 class TCPClientSocket : public Socket {
   230 class TCPClientSocket : public Socket {
   193 private:
   231 private:
   194 	AddressInfos::AddressInfo remoteAddress;
   232 	AddressInfos::AddressInfo remoteAddress;
   195 
   233 
   196 public:
   234 public:
   330 static std::vector<std::shared_ptr<SocketFactory>> factories
   368 static std::vector<std::shared_ptr<SocketFactory>> factories
   331 {
   369 {
   332 	std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (),
   370 	std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (),
   333 	std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPServerSocket >> (),
   371 	std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPServerSocket >> (),
   334 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (),
   372 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (),
   335 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class
   373 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPServerSocket >> (),
   336 	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPClientSocket >> (),
   374 	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPClientSocket >> (),
   337 	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class
   375 	std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class
   338 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDSClientSocket >> (),
   376 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDSClientSocket >> (),
   339 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
   377 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDSClientSocket >> (), // TODO: correct class
   340 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDSClientSocket >> (), // TODO: correct class
   378 	std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDSClientSocket >> (), // TODO: correct class