# HG changeset patch # User František Kučera # Date 1660951086 -7200 # Node ID f2697551bfd5c05df870f059f99c94cdd4283f6f # Parent e6e5780339bdc30b6ee1bcfa38c03848bb245723 TCP server: first version diff -r e6e5780339bd -r f2697551bfd5 src/Socket.cpp --- a/src/Socket.cpp Sat Aug 20 00:20:03 2022 +0200 +++ b/src/Socket.cpp Sat Aug 20 01:18:06 2022 +0200 @@ -217,6 +217,38 @@ } }; +class TCPServerSocket : public Socket { +private: + AddressInfos::AddressInfo localAddress; + FD socket; +public: + + TCPServerSocket(AddressInfos::AddressInfo localAddress) : localAddress(localAddress), socket(::socket(localAddress.ai->ai_family, localAddress.ai->ai_socktype, localAddress.ai->ai_protocol)) { + } + + static std::shared_ptr open(const SocketOptions& options) { + auto socket = openClientSocket(options, SOCK_STREAM, IPPROTO_TCP); + auto ai = socket->localAddress.ai; + int reuseAddr = true; + check(::setsockopt(socket->socket.getFD(), SOL_SOCKET, SO_REUSEADDR, &reuseAddr, sizeof (reuseAddr)), "setsockopt SO_REUSEADDR"); + check(::bind(socket->socket.getFD(), ai->ai_addr, ai->ai_addrlen), "bind"); + check(::listen(socket->socket.getFD(), 10), "listen"); // TODO: configurable backlog connection count? + return socket; + } + + void send(const OutgoingMessage& message) override { + FD clientSocket(accept(socket.getFD(), nullptr, 0)); + ssize_t written = ::write(clientSocket.getFD(), message.data.c_str(), message.data.size()); + if (written != message.data.size()) throw std::logic_error("writing to the socket failed"); + // TODO: partial writes, repeat + } + + const IncomingMessage receive() override { + // TODO: TCP receive() + return IncomingMessage("TODO: receive() a message"); + } +}; + class SCTPClientSocket : public MSGSocket { private: AddressInfos::AddressInfo remoteAddress; @@ -298,11 +330,11 @@ static std::vector> factories { std::make_shared> (), - std::make_shared> (), // TODO: correct class + std::make_shared> (), std::make_shared> (), std::make_shared> (), // TODO: correct class std::make_shared> (), - std::make_shared> (), // TODO: do we need a stream-mode SCTP? + std::make_shared> (), // TODO: correct class std::make_shared> (), std::make_shared> (), // TODO: correct class std::make_shared> (), // TODO: correct class