# HG changeset patch # User František Kučera # Date 1660786795 -7200 # Node ID 9a7c42cca24b8bd3f99890d29105ee8fec4c2b18 # Parent 1c6c86697837ead109c24751c765912c68254355 SCTP: sendmsg() diff -r 1c6c86697837 -r 9a7c42cca24b src/Socket.cpp --- a/src/Socket.cpp Wed Aug 17 23:28:20 2022 +0200 +++ b/src/Socket.cpp Thu Aug 18 03:39:55 2022 +0200 @@ -220,6 +220,40 @@ } }; +class SCTPMessageClientSocket : 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)) { + } + + static std::shared_ptr open(const SocketOptions& options) { + 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; + } + + void send(const std::string& message) override { + 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_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 { + // TODO: SCTP receive() + return "TODO: receive() a message"; + } +}; + template class TemplateSocketFactory : public SocketFactory { public: @@ -242,7 +276,7 @@ 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> (), // TODO: do we need a stream-mode SCTP? std::make_shared> (), // TODO: correct class std::make_shared> (), // TODO: correct class