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 }; |