218 // TODO: SCTP receive() |
218 // TODO: SCTP receive() |
219 return "TODO: receive() a message"; |
219 return "TODO: receive() a message"; |
220 } |
220 } |
221 }; |
221 }; |
222 |
222 |
|
223 class SCTPMessageClientSocket : public Socket { |
|
224 private: |
|
225 AddressInfos::AddressInfo remoteAddress; |
|
226 FD socket; |
|
227 |
|
228 public: |
|
229 |
|
230 SCTPMessageClientSocket(AddressInfos::AddressInfo remoteAddress) : remoteAddress(remoteAddress), socket(::socket(remoteAddress.ai->ai_family, remoteAddress.ai->ai_socktype, remoteAddress.ai->ai_protocol)) { |
|
231 } |
|
232 |
|
233 static std::shared_ptr<Socket> open(const SocketOptions& options) { |
|
234 auto socket = openClientSocket<SCTPMessageClientSocket>(options, SOCK_STREAM, IPPROTO_SCTP); |
|
235 check(::connect(socket->socket.getFD(), socket->remoteAddress.ai->ai_addr, socket->remoteAddress.ai->ai_addrlen), "connect socket"); |
|
236 return socket; |
|
237 } |
|
238 |
|
239 void send(const std::string& message) override { |
|
240 iovec iov[1]; |
|
241 msghdr msg = {}; |
|
242 msg.msg_iov = iov; |
|
243 msg.msg_iov[0].iov_base = (void*) message.c_str(); // TODO: const? |
|
244 msg.msg_iov[0].iov_len = message.size(); |
|
245 msg.msg_iovlen = sizeof (iov) / sizeof (iov[0]); |
|
246 ssize_t written = ::sendmsg(socket.getFD(), &msg, 0); |
|
247 if (written != message.size()) throw std::logic_error("writing to the socket failed"); |
|
248 // TODO: partial writes, repeat |
|
249 } |
|
250 |
|
251 const std::string receive() override { |
|
252 // TODO: SCTP receive() |
|
253 return "TODO: receive() a message"; |
|
254 } |
|
255 }; |
|
256 |
223 template<const char* protocol, const char* role, const char* mode, typename SocketClass> |
257 template<const char* protocol, const char* role, const char* mode, typename SocketClass> |
224 class TemplateSocketFactory : public SocketFactory { |
258 class TemplateSocketFactory : public SocketFactory { |
225 public: |
259 public: |
226 |
260 |
227 bool canHandle(const SocketOptions& options) override { |
261 bool canHandle(const SocketOptions& options) override { |
240 std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (), |
274 std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_CLIENT, MODE_STREAM, TCPClientSocket >> (), |
241 std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPClientSocket >> (), // TODO: correct class |
275 std::make_shared<TemplateSocketFactory<PROTOCOL_TCP, ROLE_SERVER, MODE_STREAM, TCPClientSocket >> (), // TODO: correct class |
242 std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (), |
276 std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (), |
243 std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class |
277 std::make_shared<TemplateSocketFactory<PROTOCOL_UDP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class |
244 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPStreamClientSocket >> (), // TODO: do we need a stream-mode SCTP? |
278 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_STREAM, SCTPStreamClientSocket >> (), // TODO: do we need a stream-mode SCTP? |
245 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_DATAGRAM, SCTPStreamClientSocket >> (), |
279 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_CLIENT, MODE_DATAGRAM, SCTPMessageClientSocket >> (), |
246 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: do we need a stream-mode SCTP? |
280 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: do we need a stream-mode SCTP? |
247 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class |
281 std::make_shared<TemplateSocketFactory<PROTOCOL_SCTP, ROLE_SERVER, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class |
248 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class |
282 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class |
249 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class |
283 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_CLIENT, MODE_DATAGRAM, UDPClientSocket >> (), // TODO: correct class |
250 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class |
284 std::make_shared<TemplateSocketFactory<PROTOCOL_UDS, ROLE_SERVER, MODE_STREAM, UDPClientSocket >> (), // TODO: correct class |