# HG changeset patch # User František Kučera # Date 1660786999 -7200 # Node ID 4d97d58d40df75023a9d5c98e3ec1b29753ae42c # Parent 9a7c42cca24b8bd3f99890d29105ee8fec4c2b18 SCTP: sendmsg() only diff -r 9a7c42cca24b -r 4d97d58d40df src/Socket.cpp --- a/src/Socket.cpp Thu Aug 18 03:39:55 2022 +0200 +++ b/src/Socket.cpp Thu Aug 18 03:43:19 2022 +0200 @@ -191,47 +191,18 @@ } }; -class SCTPStreamClientSocket : public Socket { -private: - AddressInfos::AddressInfo remoteAddress; - -public: - - SCTPStreamClientSocket(AddressInfos::AddressInfo remoteAddress) : remoteAddress(remoteAddress) { - } - - static std::shared_ptr open(const SocketOptions& options) { - auto socket = openClientSocket(options, SOCK_STREAM, IPPROTO_SCTP); - return socket; - } - - void send(const std::string& message) override { - auto ai = remoteAddress.ai; - FD s(::socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)); - check(::connect(s.getFD(), ai->ai_addr, ai->ai_addrlen), "connect socket"); - ssize_t written = ::write(s.getFD(), message.c_str(), message.size()); - if (written != message.size()) throw std::logic_error("writing to the socket failed"); - // TODO: partial writes, repeat - } - - const std::string receive() override { - // TODO: SCTP receive() - return "TODO: receive() a message"; - } -}; - -class SCTPMessageClientSocket : public Socket { +class SCTPClientSocket : public Socket { private: AddressInfos::AddressInfo remoteAddress; FD socket; public: - SCTPMessageClientSocket(AddressInfos::AddressInfo remoteAddress) : remoteAddress(remoteAddress), socket(::socket(remoteAddress.ai->ai_family, remoteAddress.ai->ai_socktype, remoteAddress.ai->ai_protocol)) { + SCTPClientSocket(AddressInfos::AddressInfo remoteAddress) : remoteAddress(remoteAddress), socket(::socket(remoteAddress.ai->ai_family, remoteAddress.ai->ai_socktype, remoteAddress.ai->ai_protocol)) { } static std::shared_ptr open(const SocketOptions& options) { - auto socket = openClientSocket(options, SOCK_STREAM, IPPROTO_SCTP); + auto socket = openClientSocket(options, SOCK_STREAM, IPPROTO_SCTP); check(::connect(socket->socket.getFD(), socket->remoteAddress.ai->ai_addr, socket->remoteAddress.ai->ai_addrlen), "connect socket"); return socket; } @@ -240,12 +211,11 @@ iovec iov[1]; msghdr msg = {}; msg.msg_iov = iov; - msg.msg_iov[0].iov_base = (void*) message.c_str(); // TODO: const? + msg.msg_iov[0].iov_base = (void*) message.c_str(); msg.msg_iov[0].iov_len = message.size(); msg.msg_iovlen = sizeof (iov) / sizeof (iov[0]); ssize_t written = ::sendmsg(socket.getFD(), &msg, 0); if (written != message.size()) throw std::logic_error("writing to the socket failed"); - // TODO: partial writes, repeat } const std::string receive() override { @@ -275,8 +245,8 @@ std::make_shared> (), // TODO: correct class std::make_shared> (), std::make_shared> (), // TODO: correct class - std::make_shared> (), // TODO: do we need a stream-mode SCTP? - std::make_shared> (), + std::make_shared> (), + std::make_shared> (), std::make_shared> (), // TODO: do we need a stream-mode SCTP? std::make_shared> (), // TODO: correct class std::make_shared> (), // TODO: correct class