seq_packet_socket.hpp 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //
  2. // Copyright (c) 2024 Klemens Morgenstern (klemens.morgenstern@gmx.net)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. #ifndef BOOST_COBALT_IOSEQ_PACKET_SOCKET_HPP
  8. #define BOOST_COBALT_IOSEQ_PACKET_SOCKET_HPP
  9. #include <boost/cobalt/io/detail/config.hpp>
  10. #include <boost/cobalt/io/endpoint.hpp>
  11. #include <boost/cobalt/io/socket.hpp>
  12. #include <boost/asio/generic/datagram_protocol.hpp>
  13. #include <boost/asio/basic_seq_packet_socket.hpp>
  14. namespace boost::cobalt::io
  15. {
  16. struct BOOST_SYMBOL_VISIBLE seq_packet_socket final : socket
  17. {
  18. BOOST_COBALT_IO_DECL seq_packet_socket(const cobalt::executor & executor = this_thread::get_executor());
  19. BOOST_COBALT_IO_DECL seq_packet_socket(seq_packet_socket && lhs);
  20. BOOST_COBALT_IO_DECL seq_packet_socket(native_handle_type h, protocol_type protocol = protocol_type(),
  21. const executor & executor = this_thread::get_executor());
  22. BOOST_COBALT_IO_DECL seq_packet_socket(endpoint ep,
  23. const executor & executor = this_thread::get_executor());
  24. struct BOOST_COBALT_IO_DECL send_op final : op<system::error_code, std::size_t>
  25. {
  26. message_flags in_flags;
  27. const_buffer_sequence buffer;
  28. send_op(message_flags in_flags, const_buffer_sequence buffer,
  29. asio::basic_seq_packet_socket<protocol_type, executor> & seq_packet_socket)
  30. : in_flags(in_flags), buffer(buffer), socket_(seq_packet_socket) {}
  31. void initiate(completion_handler<system::error_code, std::size_t> handler) final;
  32. ~send_op() = default;
  33. private:
  34. asio::basic_seq_packet_socket<protocol_type, executor> & socket_;
  35. };
  36. struct BOOST_COBALT_IO_DECL receive_op final : op<system::error_code, std::size_t>
  37. {
  38. message_flags in_flags, *out_flags;
  39. mutable_buffer_sequence buffer;
  40. receive_op(message_flags in_flags, message_flags * out_flags,
  41. mutable_buffer_sequence buffer, asio::basic_seq_packet_socket<protocol_type, executor> & seq_packet_socket)
  42. : in_flags(in_flags), out_flags(out_flags), buffer(buffer), socket_(seq_packet_socket) {}
  43. void initiate(completion_handler<system::error_code, std::size_t> handler) final;
  44. ~receive_op() = default;
  45. private:
  46. asio::basic_seq_packet_socket<protocol_type, executor> & socket_;
  47. };
  48. [[nodiscard]] receive_op receive(message_flags in_flags, message_flags& out_flags, mutable_buffer_sequence buffer)
  49. {
  50. return receive_op{in_flags, &out_flags, buffer, seq_packet_socket_};
  51. }
  52. [[nodiscard]] send_op send(message_flags in_flags, const_buffer_sequence buffer)
  53. {
  54. return send_op{in_flags, buffer, seq_packet_socket_};
  55. }
  56. [[nodiscard]] receive_op receive(message_flags in_flags, mutable_buffer_sequence buffer)
  57. {
  58. return receive_op{in_flags, nullptr, buffer, seq_packet_socket_};
  59. }
  60. public:
  61. BOOST_COBALT_IO_DECL void adopt_endpoint_(endpoint & ep) override;
  62. asio::basic_seq_packet_socket<protocol_type, executor> seq_packet_socket_;
  63. };
  64. inline system::result<std::pair<seq_packet_socket, seq_packet_socket>> make_pair(decltype(local_seqpacket) protocol)
  65. {
  66. std::pair<seq_packet_socket, seq_packet_socket> res;
  67. auto c = connect_pair(protocol, res.first, res.second);
  68. if (c)
  69. return res;
  70. else
  71. return c.error();
  72. }
  73. }
  74. #endif //BOOST_COBALT_IOSEQ_PACKET_SOCKET_HPP