├── .github └── workflows │ └── c-cpp.yml ├── .gitignore ├── .gitmodules ├── CMakeLists.txt ├── LICENSE ├── README.md ├── README_ZH.md ├── build.sh ├── deps ├── asio │ ├── LICENSE_1_0.txt │ ├── asio.hpp │ └── asio │ │ ├── any_completion_executor.hpp │ │ ├── any_completion_handler.hpp │ │ ├── any_io_executor.hpp │ │ ├── append.hpp │ │ ├── as_tuple.hpp │ │ ├── associated_allocator.hpp │ │ ├── associated_cancellation_slot.hpp │ │ ├── associated_executor.hpp │ │ ├── associated_immediate_executor.hpp │ │ ├── associator.hpp │ │ ├── async_result.hpp │ │ ├── awaitable.hpp │ │ ├── basic_datagram_socket.hpp │ │ ├── basic_deadline_timer.hpp │ │ ├── basic_file.hpp │ │ ├── basic_io_object.hpp │ │ ├── basic_random_access_file.hpp │ │ ├── basic_raw_socket.hpp │ │ ├── basic_readable_pipe.hpp │ │ ├── basic_seq_packet_socket.hpp │ │ ├── basic_serial_port.hpp │ │ ├── basic_signal_set.hpp │ │ ├── basic_socket.hpp │ │ ├── basic_socket_acceptor.hpp │ │ ├── basic_socket_iostream.hpp │ │ ├── basic_socket_streambuf.hpp │ │ ├── basic_stream_file.hpp │ │ ├── basic_stream_socket.hpp │ │ ├── basic_streambuf.hpp │ │ ├── basic_streambuf_fwd.hpp │ │ ├── basic_waitable_timer.hpp │ │ ├── basic_writable_pipe.hpp │ │ ├── bind_allocator.hpp │ │ ├── bind_cancellation_slot.hpp │ │ ├── bind_executor.hpp │ │ ├── bind_immediate_executor.hpp │ │ ├── buffer.hpp │ │ ├── buffer_registration.hpp │ │ ├── buffered_read_stream.hpp │ │ ├── buffered_read_stream_fwd.hpp │ │ ├── buffered_stream.hpp │ │ ├── buffered_stream_fwd.hpp │ │ ├── buffered_write_stream.hpp │ │ ├── buffered_write_stream_fwd.hpp │ │ ├── buffers_iterator.hpp │ │ ├── cancellation_signal.hpp │ │ ├── cancellation_state.hpp │ │ ├── cancellation_type.hpp │ │ ├── co_spawn.hpp │ │ ├── completion_condition.hpp │ │ ├── compose.hpp │ │ ├── connect.hpp │ │ ├── connect_pipe.hpp │ │ ├── consign.hpp │ │ ├── coroutine.hpp │ │ ├── deadline_timer.hpp │ │ ├── defer.hpp │ │ ├── deferred.hpp │ │ ├── detached.hpp │ │ ├── detail │ │ ├── array.hpp │ │ ├── array_fwd.hpp │ │ ├── assert.hpp │ │ ├── atomic_count.hpp │ │ ├── base_from_cancellation_state.hpp │ │ ├── base_from_completion_cond.hpp │ │ ├── bind_handler.hpp │ │ ├── blocking_executor_op.hpp │ │ ├── buffer_resize_guard.hpp │ │ ├── buffer_sequence_adapter.hpp │ │ ├── buffered_stream_storage.hpp │ │ ├── bulk_executor_op.hpp │ │ ├── call_stack.hpp │ │ ├── chrono.hpp │ │ ├── chrono_time_traits.hpp │ │ ├── completion_handler.hpp │ │ ├── composed_work.hpp │ │ ├── concurrency_hint.hpp │ │ ├── conditionally_enabled_event.hpp │ │ ├── conditionally_enabled_mutex.hpp │ │ ├── config.hpp │ │ ├── consuming_buffers.hpp │ │ ├── cstddef.hpp │ │ ├── cstdint.hpp │ │ ├── date_time_fwd.hpp │ │ ├── deadline_timer_service.hpp │ │ ├── dependent_type.hpp │ │ ├── descriptor_ops.hpp │ │ ├── descriptor_read_op.hpp │ │ ├── descriptor_write_op.hpp │ │ ├── dev_poll_reactor.hpp │ │ ├── epoll_reactor.hpp │ │ ├── event.hpp │ │ ├── eventfd_select_interrupter.hpp │ │ ├── exception.hpp │ │ ├── executor_function.hpp │ │ ├── executor_op.hpp │ │ ├── fd_set_adapter.hpp │ │ ├── fenced_block.hpp │ │ ├── functional.hpp │ │ ├── future.hpp │ │ ├── gcc_arm_fenced_block.hpp │ │ ├── gcc_hppa_fenced_block.hpp │ │ ├── gcc_sync_fenced_block.hpp │ │ ├── gcc_x86_fenced_block.hpp │ │ ├── global.hpp │ │ ├── handler_alloc_helpers.hpp │ │ ├── handler_cont_helpers.hpp │ │ ├── handler_invoke_helpers.hpp │ │ ├── handler_tracking.hpp │ │ ├── handler_type_requirements.hpp │ │ ├── handler_work.hpp │ │ ├── hash_map.hpp │ │ ├── impl │ │ │ ├── buffer_sequence_adapter.ipp │ │ │ ├── descriptor_ops.ipp │ │ │ ├── dev_poll_reactor.hpp │ │ │ ├── dev_poll_reactor.ipp │ │ │ ├── epoll_reactor.hpp │ │ │ ├── epoll_reactor.ipp │ │ │ ├── eventfd_select_interrupter.ipp │ │ │ ├── handler_tracking.ipp │ │ │ ├── io_uring_descriptor_service.ipp │ │ │ ├── io_uring_file_service.ipp │ │ │ ├── io_uring_service.hpp │ │ │ ├── io_uring_service.ipp │ │ │ ├── io_uring_socket_service_base.ipp │ │ │ ├── kqueue_reactor.hpp │ │ │ ├── kqueue_reactor.ipp │ │ │ ├── null_event.ipp │ │ │ ├── pipe_select_interrupter.ipp │ │ │ ├── posix_event.ipp │ │ │ ├── posix_mutex.ipp │ │ │ ├── posix_serial_port_service.ipp │ │ │ ├── posix_thread.ipp │ │ │ ├── posix_tss_ptr.ipp │ │ │ ├── reactive_descriptor_service.ipp │ │ │ ├── reactive_socket_service_base.ipp │ │ │ ├── resolver_service_base.ipp │ │ │ ├── scheduler.ipp │ │ │ ├── select_reactor.hpp │ │ │ ├── select_reactor.ipp │ │ │ ├── service_registry.hpp │ │ │ ├── service_registry.ipp │ │ │ ├── signal_set_service.ipp │ │ │ ├── socket_ops.ipp │ │ │ ├── socket_select_interrupter.ipp │ │ │ ├── strand_executor_service.hpp │ │ │ ├── strand_executor_service.ipp │ │ │ ├── strand_service.hpp │ │ │ ├── strand_service.ipp │ │ │ ├── thread_context.ipp │ │ │ ├── throw_error.ipp │ │ │ ├── timer_queue_ptime.ipp │ │ │ ├── timer_queue_set.ipp │ │ │ ├── win_event.ipp │ │ │ ├── win_iocp_file_service.ipp │ │ │ ├── win_iocp_handle_service.ipp │ │ │ ├── win_iocp_io_context.hpp │ │ │ ├── win_iocp_io_context.ipp │ │ │ ├── win_iocp_serial_port_service.ipp │ │ │ ├── win_iocp_socket_service_base.ipp │ │ │ ├── win_mutex.ipp │ │ │ ├── win_object_handle_service.ipp │ │ │ ├── win_static_mutex.ipp │ │ │ ├── win_thread.ipp │ │ │ ├── win_tss_ptr.ipp │ │ │ ├── winrt_ssocket_service_base.ipp │ │ │ ├── winrt_timer_scheduler.hpp │ │ │ ├── winrt_timer_scheduler.ipp │ │ │ └── winsock_init.ipp │ │ ├── initiate_defer.hpp │ │ ├── initiate_dispatch.hpp │ │ ├── initiate_post.hpp │ │ ├── io_control.hpp │ │ ├── io_object_impl.hpp │ │ ├── io_uring_descriptor_read_at_op.hpp │ │ ├── io_uring_descriptor_read_op.hpp │ │ ├── io_uring_descriptor_service.hpp │ │ ├── io_uring_descriptor_write_at_op.hpp │ │ ├── io_uring_descriptor_write_op.hpp │ │ ├── io_uring_file_service.hpp │ │ ├── io_uring_null_buffers_op.hpp │ │ ├── io_uring_operation.hpp │ │ ├── io_uring_service.hpp │ │ ├── io_uring_socket_accept_op.hpp │ │ ├── io_uring_socket_connect_op.hpp │ │ ├── io_uring_socket_recv_op.hpp │ │ ├── io_uring_socket_recvfrom_op.hpp │ │ ├── io_uring_socket_recvmsg_op.hpp │ │ ├── io_uring_socket_send_op.hpp │ │ ├── io_uring_socket_sendto_op.hpp │ │ ├── io_uring_socket_service.hpp │ │ ├── io_uring_socket_service_base.hpp │ │ ├── io_uring_wait_op.hpp │ │ ├── is_buffer_sequence.hpp │ │ ├── is_executor.hpp │ │ ├── keyword_tss_ptr.hpp │ │ ├── kqueue_reactor.hpp │ │ ├── limits.hpp │ │ ├── local_free_on_block_exit.hpp │ │ ├── macos_fenced_block.hpp │ │ ├── memory.hpp │ │ ├── mutex.hpp │ │ ├── non_const_lvalue.hpp │ │ ├── noncopyable.hpp │ │ ├── null_event.hpp │ │ ├── null_fenced_block.hpp │ │ ├── null_global.hpp │ │ ├── null_mutex.hpp │ │ ├── null_reactor.hpp │ │ ├── null_signal_blocker.hpp │ │ ├── null_socket_service.hpp │ │ ├── null_static_mutex.hpp │ │ ├── null_thread.hpp │ │ ├── null_tss_ptr.hpp │ │ ├── object_pool.hpp │ │ ├── old_win_sdk_compat.hpp │ │ ├── op_queue.hpp │ │ ├── operation.hpp │ │ ├── pipe_select_interrupter.hpp │ │ ├── pop_options.hpp │ │ ├── posix_event.hpp │ │ ├── posix_fd_set_adapter.hpp │ │ ├── posix_global.hpp │ │ ├── posix_mutex.hpp │ │ ├── posix_serial_port_service.hpp │ │ ├── posix_signal_blocker.hpp │ │ ├── posix_static_mutex.hpp │ │ ├── posix_thread.hpp │ │ ├── posix_tss_ptr.hpp │ │ ├── push_options.hpp │ │ ├── reactive_descriptor_service.hpp │ │ ├── reactive_null_buffers_op.hpp │ │ ├── reactive_socket_accept_op.hpp │ │ ├── reactive_socket_connect_op.hpp │ │ ├── reactive_socket_recv_op.hpp │ │ ├── reactive_socket_recvfrom_op.hpp │ │ ├── reactive_socket_recvmsg_op.hpp │ │ ├── reactive_socket_send_op.hpp │ │ ├── reactive_socket_sendto_op.hpp │ │ ├── reactive_socket_service.hpp │ │ ├── reactive_socket_service_base.hpp │ │ ├── reactive_wait_op.hpp │ │ ├── reactor.hpp │ │ ├── reactor_op.hpp │ │ ├── reactor_op_queue.hpp │ │ ├── recycling_allocator.hpp │ │ ├── regex_fwd.hpp │ │ ├── resolve_endpoint_op.hpp │ │ ├── resolve_op.hpp │ │ ├── resolve_query_op.hpp │ │ ├── resolver_service.hpp │ │ ├── resolver_service_base.hpp │ │ ├── scheduler.hpp │ │ ├── scheduler_operation.hpp │ │ ├── scheduler_task.hpp │ │ ├── scheduler_thread_info.hpp │ │ ├── scoped_lock.hpp │ │ ├── scoped_ptr.hpp │ │ ├── select_interrupter.hpp │ │ ├── select_reactor.hpp │ │ ├── service_registry.hpp │ │ ├── signal_blocker.hpp │ │ ├── signal_handler.hpp │ │ ├── signal_init.hpp │ │ ├── signal_op.hpp │ │ ├── signal_set_service.hpp │ │ ├── socket_holder.hpp │ │ ├── socket_ops.hpp │ │ ├── socket_option.hpp │ │ ├── socket_select_interrupter.hpp │ │ ├── socket_types.hpp │ │ ├── solaris_fenced_block.hpp │ │ ├── source_location.hpp │ │ ├── static_mutex.hpp │ │ ├── std_event.hpp │ │ ├── std_fenced_block.hpp │ │ ├── std_global.hpp │ │ ├── std_mutex.hpp │ │ ├── std_static_mutex.hpp │ │ ├── std_thread.hpp │ │ ├── strand_executor_service.hpp │ │ ├── strand_service.hpp │ │ ├── string_view.hpp │ │ ├── thread.hpp │ │ ├── thread_context.hpp │ │ ├── thread_group.hpp │ │ ├── thread_info_base.hpp │ │ ├── throw_error.hpp │ │ ├── throw_exception.hpp │ │ ├── timer_queue.hpp │ │ ├── timer_queue_base.hpp │ │ ├── timer_queue_ptime.hpp │ │ ├── timer_queue_set.hpp │ │ ├── timer_scheduler.hpp │ │ ├── timer_scheduler_fwd.hpp │ │ ├── tss_ptr.hpp │ │ ├── type_traits.hpp │ │ ├── utility.hpp │ │ ├── variadic_templates.hpp │ │ ├── wait_handler.hpp │ │ ├── wait_op.hpp │ │ ├── win_event.hpp │ │ ├── win_fd_set_adapter.hpp │ │ ├── win_fenced_block.hpp │ │ ├── win_global.hpp │ │ ├── win_iocp_file_service.hpp │ │ ├── win_iocp_handle_read_op.hpp │ │ ├── win_iocp_handle_service.hpp │ │ ├── win_iocp_handle_write_op.hpp │ │ ├── win_iocp_io_context.hpp │ │ ├── win_iocp_null_buffers_op.hpp │ │ ├── win_iocp_operation.hpp │ │ ├── win_iocp_overlapped_op.hpp │ │ ├── win_iocp_overlapped_ptr.hpp │ │ ├── win_iocp_serial_port_service.hpp │ │ ├── win_iocp_socket_accept_op.hpp │ │ ├── win_iocp_socket_connect_op.hpp │ │ ├── win_iocp_socket_recv_op.hpp │ │ ├── win_iocp_socket_recvfrom_op.hpp │ │ ├── win_iocp_socket_recvmsg_op.hpp │ │ ├── win_iocp_socket_send_op.hpp │ │ ├── win_iocp_socket_service.hpp │ │ ├── win_iocp_socket_service_base.hpp │ │ ├── win_iocp_thread_info.hpp │ │ ├── win_iocp_wait_op.hpp │ │ ├── win_mutex.hpp │ │ ├── win_object_handle_service.hpp │ │ ├── win_static_mutex.hpp │ │ ├── win_thread.hpp │ │ ├── win_tss_ptr.hpp │ │ ├── winapp_thread.hpp │ │ ├── wince_thread.hpp │ │ ├── winrt_async_manager.hpp │ │ ├── winrt_async_op.hpp │ │ ├── winrt_resolve_op.hpp │ │ ├── winrt_resolver_service.hpp │ │ ├── winrt_socket_connect_op.hpp │ │ ├── winrt_socket_recv_op.hpp │ │ ├── winrt_socket_send_op.hpp │ │ ├── winrt_ssocket_service.hpp │ │ ├── winrt_ssocket_service_base.hpp │ │ ├── winrt_timer_scheduler.hpp │ │ ├── winrt_utils.hpp │ │ ├── winsock_init.hpp │ │ ├── work_dispatcher.hpp │ │ └── wrapped_handler.hpp │ │ ├── dispatch.hpp │ │ ├── error.hpp │ │ ├── error_code.hpp │ │ ├── execution.hpp │ │ ├── execution │ │ ├── allocator.hpp │ │ ├── any_executor.hpp │ │ ├── bad_executor.hpp │ │ ├── blocking.hpp │ │ ├── blocking_adaptation.hpp │ │ ├── bulk_execute.hpp │ │ ├── bulk_guarantee.hpp │ │ ├── connect.hpp │ │ ├── context.hpp │ │ ├── context_as.hpp │ │ ├── detail │ │ │ ├── as_invocable.hpp │ │ │ ├── as_operation.hpp │ │ │ ├── as_receiver.hpp │ │ │ ├── bulk_sender.hpp │ │ │ ├── submit_receiver.hpp │ │ │ └── void_receiver.hpp │ │ ├── execute.hpp │ │ ├── executor.hpp │ │ ├── impl │ │ │ ├── bad_executor.ipp │ │ │ └── receiver_invocation_error.ipp │ │ ├── invocable_archetype.hpp │ │ ├── mapping.hpp │ │ ├── occupancy.hpp │ │ ├── operation_state.hpp │ │ ├── outstanding_work.hpp │ │ ├── prefer_only.hpp │ │ ├── receiver.hpp │ │ ├── receiver_invocation_error.hpp │ │ ├── relationship.hpp │ │ ├── schedule.hpp │ │ ├── scheduler.hpp │ │ ├── sender.hpp │ │ ├── set_done.hpp │ │ ├── set_error.hpp │ │ ├── set_value.hpp │ │ ├── start.hpp │ │ └── submit.hpp │ │ ├── execution_context.hpp │ │ ├── executor.hpp │ │ ├── executor_work_guard.hpp │ │ ├── experimental │ │ ├── append.hpp │ │ ├── as_single.hpp │ │ ├── as_tuple.hpp │ │ ├── awaitable_operators.hpp │ │ ├── basic_channel.hpp │ │ ├── basic_concurrent_channel.hpp │ │ ├── cancellation_condition.hpp │ │ ├── channel.hpp │ │ ├── channel_error.hpp │ │ ├── channel_traits.hpp │ │ ├── co_composed.hpp │ │ ├── co_spawn.hpp │ │ ├── concurrent_channel.hpp │ │ ├── coro.hpp │ │ ├── coro_traits.hpp │ │ ├── deferred.hpp │ │ ├── detail │ │ │ ├── channel_handler.hpp │ │ │ ├── channel_message.hpp │ │ │ ├── channel_operation.hpp │ │ │ ├── channel_payload.hpp │ │ │ ├── channel_receive_op.hpp │ │ │ ├── channel_send_functions.hpp │ │ │ ├── channel_send_op.hpp │ │ │ ├── channel_service.hpp │ │ │ ├── coro_completion_handler.hpp │ │ │ ├── coro_promise_allocator.hpp │ │ │ ├── has_signature.hpp │ │ │ ├── impl │ │ │ │ └── channel_service.hpp │ │ │ └── partial_promise.hpp │ │ ├── impl │ │ │ ├── as_single.hpp │ │ │ ├── channel_error.ipp │ │ │ ├── co_composed.hpp │ │ │ ├── coro.hpp │ │ │ ├── parallel_group.hpp │ │ │ ├── promise.hpp │ │ │ ├── use_coro.hpp │ │ │ └── use_promise.hpp │ │ ├── parallel_group.hpp │ │ ├── prepend.hpp │ │ ├── promise.hpp │ │ ├── use_coro.hpp │ │ └── use_promise.hpp │ │ ├── file_base.hpp │ │ ├── generic │ │ ├── basic_endpoint.hpp │ │ ├── datagram_protocol.hpp │ │ ├── detail │ │ │ ├── endpoint.hpp │ │ │ └── impl │ │ │ │ └── endpoint.ipp │ │ ├── raw_protocol.hpp │ │ ├── seq_packet_protocol.hpp │ │ └── stream_protocol.hpp │ │ ├── handler_alloc_hook.hpp │ │ ├── handler_continuation_hook.hpp │ │ ├── handler_invoke_hook.hpp │ │ ├── high_resolution_timer.hpp │ │ ├── impl │ │ ├── any_completion_executor.ipp │ │ ├── any_io_executor.ipp │ │ ├── append.hpp │ │ ├── as_tuple.hpp │ │ ├── awaitable.hpp │ │ ├── buffered_read_stream.hpp │ │ ├── buffered_write_stream.hpp │ │ ├── cancellation_signal.ipp │ │ ├── co_spawn.hpp │ │ ├── connect.hpp │ │ ├── connect_pipe.hpp │ │ ├── connect_pipe.ipp │ │ ├── consign.hpp │ │ ├── deferred.hpp │ │ ├── detached.hpp │ │ ├── error.ipp │ │ ├── error_code.ipp │ │ ├── execution_context.hpp │ │ ├── execution_context.ipp │ │ ├── executor.hpp │ │ ├── executor.ipp │ │ ├── handler_alloc_hook.ipp │ │ ├── io_context.hpp │ │ ├── io_context.ipp │ │ ├── multiple_exceptions.ipp │ │ ├── prepend.hpp │ │ ├── read.hpp │ │ ├── read_at.hpp │ │ ├── read_until.hpp │ │ ├── redirect_error.hpp │ │ ├── serial_port_base.hpp │ │ ├── serial_port_base.ipp │ │ ├── spawn.hpp │ │ ├── src.hpp │ │ ├── system_context.hpp │ │ ├── system_context.ipp │ │ ├── system_executor.hpp │ │ ├── thread_pool.hpp │ │ ├── thread_pool.ipp │ │ ├── use_awaitable.hpp │ │ ├── use_future.hpp │ │ ├── write.hpp │ │ └── write_at.hpp │ │ ├── io_context.hpp │ │ ├── io_context_strand.hpp │ │ ├── io_service.hpp │ │ ├── io_service_strand.hpp │ │ ├── ip │ │ ├── address.hpp │ │ ├── address_v4.hpp │ │ ├── address_v4_iterator.hpp │ │ ├── address_v4_range.hpp │ │ ├── address_v6.hpp │ │ ├── address_v6_iterator.hpp │ │ ├── address_v6_range.hpp │ │ ├── bad_address_cast.hpp │ │ ├── basic_endpoint.hpp │ │ ├── basic_resolver.hpp │ │ ├── basic_resolver_entry.hpp │ │ ├── basic_resolver_iterator.hpp │ │ ├── basic_resolver_query.hpp │ │ ├── basic_resolver_results.hpp │ │ ├── detail │ │ │ ├── endpoint.hpp │ │ │ ├── impl │ │ │ │ └── endpoint.ipp │ │ │ └── socket_option.hpp │ │ ├── host_name.hpp │ │ ├── icmp.hpp │ │ ├── impl │ │ │ ├── address.hpp │ │ │ ├── address.ipp │ │ │ ├── address_v4.hpp │ │ │ ├── address_v4.ipp │ │ │ ├── address_v6.hpp │ │ │ ├── address_v6.ipp │ │ │ ├── basic_endpoint.hpp │ │ │ ├── host_name.ipp │ │ │ ├── network_v4.hpp │ │ │ ├── network_v4.ipp │ │ │ ├── network_v6.hpp │ │ │ └── network_v6.ipp │ │ ├── multicast.hpp │ │ ├── network_v4.hpp │ │ ├── network_v6.hpp │ │ ├── resolver_base.hpp │ │ ├── resolver_query_base.hpp │ │ ├── tcp.hpp │ │ ├── udp.hpp │ │ ├── unicast.hpp │ │ └── v6_only.hpp │ │ ├── is_applicable_property.hpp │ │ ├── is_contiguous_iterator.hpp │ │ ├── is_executor.hpp │ │ ├── is_read_buffered.hpp │ │ ├── is_write_buffered.hpp │ │ ├── local │ │ ├── basic_endpoint.hpp │ │ ├── connect_pair.hpp │ │ ├── datagram_protocol.hpp │ │ ├── detail │ │ │ ├── endpoint.hpp │ │ │ └── impl │ │ │ │ └── endpoint.ipp │ │ ├── seq_packet_protocol.hpp │ │ └── stream_protocol.hpp │ │ ├── multiple_exceptions.hpp │ │ ├── packaged_task.hpp │ │ ├── placeholders.hpp │ │ ├── posix │ │ ├── basic_descriptor.hpp │ │ ├── basic_stream_descriptor.hpp │ │ ├── descriptor.hpp │ │ ├── descriptor_base.hpp │ │ └── stream_descriptor.hpp │ │ ├── post.hpp │ │ ├── prefer.hpp │ │ ├── prepend.hpp │ │ ├── query.hpp │ │ ├── random_access_file.hpp │ │ ├── read.hpp │ │ ├── read_at.hpp │ │ ├── read_until.hpp │ │ ├── readable_pipe.hpp │ │ ├── recycling_allocator.hpp │ │ ├── redirect_error.hpp │ │ ├── registered_buffer.hpp │ │ ├── require.hpp │ │ ├── require_concept.hpp │ │ ├── serial_port.hpp │ │ ├── serial_port_base.hpp │ │ ├── signal_set.hpp │ │ ├── signal_set_base.hpp │ │ ├── socket_base.hpp │ │ ├── spawn.hpp │ │ ├── ssl.hpp │ │ ├── ssl │ │ ├── context.hpp │ │ ├── context_base.hpp │ │ ├── detail │ │ │ ├── buffered_handshake_op.hpp │ │ │ ├── engine.hpp │ │ │ ├── handshake_op.hpp │ │ │ ├── impl │ │ │ │ ├── engine.ipp │ │ │ │ └── openssl_init.ipp │ │ │ ├── io.hpp │ │ │ ├── openssl_init.hpp │ │ │ ├── openssl_types.hpp │ │ │ ├── password_callback.hpp │ │ │ ├── read_op.hpp │ │ │ ├── shutdown_op.hpp │ │ │ ├── stream_core.hpp │ │ │ ├── verify_callback.hpp │ │ │ └── write_op.hpp │ │ ├── error.hpp │ │ ├── host_name_verification.hpp │ │ ├── impl │ │ │ ├── context.hpp │ │ │ ├── context.ipp │ │ │ ├── error.ipp │ │ │ ├── host_name_verification.ipp │ │ │ ├── rfc2818_verification.ipp │ │ │ └── src.hpp │ │ ├── rfc2818_verification.hpp │ │ ├── stream.hpp │ │ ├── stream_base.hpp │ │ ├── verify_context.hpp │ │ └── verify_mode.hpp │ │ ├── static_thread_pool.hpp │ │ ├── steady_timer.hpp │ │ ├── strand.hpp │ │ ├── stream_file.hpp │ │ ├── streambuf.hpp │ │ ├── system_context.hpp │ │ ├── system_error.hpp │ │ ├── system_executor.hpp │ │ ├── system_timer.hpp │ │ ├── this_coro.hpp │ │ ├── thread.hpp │ │ ├── thread_pool.hpp │ │ ├── time_traits.hpp │ │ ├── traits │ │ ├── bulk_execute_free.hpp │ │ ├── bulk_execute_member.hpp │ │ ├── connect_free.hpp │ │ ├── connect_member.hpp │ │ ├── equality_comparable.hpp │ │ ├── execute_free.hpp │ │ ├── execute_member.hpp │ │ ├── prefer_free.hpp │ │ ├── prefer_member.hpp │ │ ├── query_free.hpp │ │ ├── query_member.hpp │ │ ├── query_static_constexpr_member.hpp │ │ ├── require_concept_free.hpp │ │ ├── require_concept_member.hpp │ │ ├── require_free.hpp │ │ ├── require_member.hpp │ │ ├── schedule_free.hpp │ │ ├── schedule_member.hpp │ │ ├── set_done_free.hpp │ │ ├── set_done_member.hpp │ │ ├── set_error_free.hpp │ │ ├── set_error_member.hpp │ │ ├── set_value_free.hpp │ │ ├── set_value_member.hpp │ │ ├── start_free.hpp │ │ ├── start_member.hpp │ │ ├── static_query.hpp │ │ ├── static_require.hpp │ │ ├── static_require_concept.hpp │ │ ├── submit_free.hpp │ │ └── submit_member.hpp │ │ ├── ts │ │ ├── buffer.hpp │ │ ├── executor.hpp │ │ ├── internet.hpp │ │ ├── io_context.hpp │ │ ├── net.hpp │ │ ├── netfwd.hpp │ │ ├── socket.hpp │ │ └── timer.hpp │ │ ├── unyield.hpp │ │ ├── use_awaitable.hpp │ │ ├── use_future.hpp │ │ ├── uses_executor.hpp │ │ ├── version.hpp │ │ ├── wait_traits.hpp │ │ ├── windows │ │ ├── basic_object_handle.hpp │ │ ├── basic_overlapped_handle.hpp │ │ ├── basic_random_access_handle.hpp │ │ ├── basic_stream_handle.hpp │ │ ├── object_handle.hpp │ │ ├── overlapped_handle.hpp │ │ ├── overlapped_ptr.hpp │ │ ├── random_access_handle.hpp │ │ └── stream_handle.hpp │ │ ├── writable_pipe.hpp │ │ ├── write.hpp │ │ ├── write_at.hpp │ │ └── yield.hpp ├── fmt │ ├── LICENSE.rst │ ├── include │ │ └── fmt │ │ │ ├── args.h │ │ │ ├── chrono.h │ │ │ ├── color.h │ │ │ ├── compile.h │ │ │ ├── core.h │ │ │ ├── format-inl.h │ │ │ ├── format.h │ │ │ ├── os.h │ │ │ ├── ostream.h │ │ │ ├── printf.h │ │ │ ├── ranges.h │ │ │ ├── std.h │ │ │ └── xchar.h │ └── src │ │ ├── fmt.cc │ │ ├── format.cc │ │ └── os.cc └── spdlog │ ├── LICENSE │ ├── include │ └── spdlog │ │ ├── async.h │ │ ├── async_logger-inl.h │ │ ├── async_logger.h │ │ ├── cfg │ │ ├── argv.h │ │ ├── env.h │ │ ├── helpers-inl.h │ │ └── helpers.h │ │ ├── common-inl.h │ │ ├── common.h │ │ ├── details │ │ ├── backtracer-inl.h │ │ ├── backtracer.h │ │ ├── circular_q.h │ │ ├── console_globals.h │ │ ├── file_helper-inl.h │ │ ├── file_helper.h │ │ ├── fmt_helper.h │ │ ├── log_msg-inl.h │ │ ├── log_msg.h │ │ ├── log_msg_buffer-inl.h │ │ ├── log_msg_buffer.h │ │ ├── mpmc_blocking_q.h │ │ ├── null_mutex.h │ │ ├── os-inl.h │ │ ├── os.h │ │ ├── periodic_worker-inl.h │ │ ├── periodic_worker.h │ │ ├── registry-inl.h │ │ ├── registry.h │ │ ├── synchronous_factory.h │ │ ├── tcp_client-windows.h │ │ ├── tcp_client.h │ │ ├── thread_pool-inl.h │ │ ├── thread_pool.h │ │ ├── udp_client-windows.h │ │ ├── udp_client.h │ │ └── windows_include.h │ │ ├── fmt │ │ ├── bin_to_hex.h │ │ ├── bundled │ │ │ ├── args.h │ │ │ ├── chrono.h │ │ │ ├── color.h │ │ │ ├── compile.h │ │ │ ├── core.h │ │ │ ├── fmt.license.rst │ │ │ ├── format-inl.h │ │ │ ├── format.h │ │ │ ├── locale.h │ │ │ ├── os.h │ │ │ ├── ostream.h │ │ │ ├── printf.h │ │ │ ├── ranges.h │ │ │ ├── std.h │ │ │ └── xchar.h │ │ ├── chrono.h │ │ ├── compile.h │ │ ├── fmt.h │ │ ├── ostr.h │ │ ├── ranges.h │ │ ├── std.h │ │ └── xchar.h │ │ ├── formatter.h │ │ ├── fwd.h │ │ ├── logger-inl.h │ │ ├── logger.h │ │ ├── pattern_formatter-inl.h │ │ ├── pattern_formatter.h │ │ ├── sinks │ │ ├── android_sink.h │ │ ├── ansicolor_sink-inl.h │ │ ├── ansicolor_sink.h │ │ ├── base_sink-inl.h │ │ ├── base_sink.h │ │ ├── basic_file_sink-inl.h │ │ ├── basic_file_sink.h │ │ ├── callback_sink.h │ │ ├── daily_file_sink.h │ │ ├── dist_sink.h │ │ ├── dup_filter_sink.h │ │ ├── hourly_file_sink.h │ │ ├── kafka_sink.h │ │ ├── mongo_sink.h │ │ ├── msvc_sink.h │ │ ├── null_sink.h │ │ ├── ostream_sink.h │ │ ├── qt_sinks.h │ │ ├── ringbuffer_sink.h │ │ ├── rotating_file_sink-inl.h │ │ ├── rotating_file_sink.h │ │ ├── sink-inl.h │ │ ├── sink.h │ │ ├── stdout_color_sinks-inl.h │ │ ├── stdout_color_sinks.h │ │ ├── stdout_sinks-inl.h │ │ ├── stdout_sinks.h │ │ ├── syslog_sink.h │ │ ├── systemd_sink.h │ │ ├── tcp_sink.h │ │ ├── udp_sink.h │ │ ├── win_eventlog_sink.h │ │ ├── wincolor_sink-inl.h │ │ └── wincolor_sink.h │ │ ├── spdlog-inl.h │ │ ├── spdlog.h │ │ ├── stopwatch.h │ │ ├── tweakme.h │ │ └── version.h │ └── src │ ├── async.cpp │ ├── bundled_fmtlib_format.cpp │ ├── cfg.cpp │ ├── color_sinks.cpp │ ├── file_sinks.cpp │ ├── spdlog.cpp │ └── stdout_sinks.cpp ├── include ├── http │ ├── http_client.hpp │ ├── http_connection.hpp │ ├── http_context.hpp │ ├── http_decoder.hpp │ ├── http_encoder.hpp │ ├── http_factory.hpp │ ├── http_message.hpp │ ├── http_parser.hpp │ ├── http_request.hpp │ ├── http_response.hpp │ ├── http_server.hpp │ └── http_url.hpp ├── kcp │ ├── ikcp.c │ ├── ikcp.h │ ├── kcp_connection.hpp │ ├── kcp_connector.hpp │ ├── kcp_listener.hpp │ └── kcp_message.hpp ├── knet.hpp ├── knet_factory.hpp ├── knet_handler.hpp ├── knet_worker.hpp ├── pipe │ ├── kpipe.hpp │ ├── pipe_connection.hpp │ ├── pipe_factory.hpp │ ├── pipe_proto.hpp │ └── pipe_session.hpp ├── tcp │ └── asio │ │ ├── tcp_connection.hpp │ │ ├── tcp_connector.hpp │ │ ├── tcp_listener.hpp │ │ ├── tcp_socket.hpp │ │ └── tls_socket.hpp ├── tls_context.hpp ├── udp │ ├── udp_connection.hpp │ ├── udp_connector.hpp │ └── udp_listener.hpp ├── utils │ ├── knet_log.hpp │ ├── knet_url.hpp │ ├── loop_buffer.hpp │ ├── singleton.hpp │ ├── string_thief.hpp │ └── timer.hpp └── websocket │ ├── wsock_client.hpp │ ├── wsock_connection.hpp │ ├── wsock_factory.hpp │ ├── wsock_protocol.hpp │ ├── wsock_router.hpp │ ├── wsock_server.hpp │ ├── wsock_shakehand.hpp │ ├── wsock_ssl_client.hpp │ ├── wsock_ssl_connection.hpp │ └── wsock_ssl_server.hpp ├── kcp ├── CMakeLists.txt └── test.h ├── opt └── llhttp-v6.0.5.tgz └── samples ├── factory_server.cpp ├── kcpclient.cpp ├── kcpserver.cpp ├── logger.cpp ├── mt_server.cpp ├── mt_server.h ├── pipe_client.cpp ├── pipe_server.cpp ├── server.cpp ├── tcpclient.cpp ├── tcpserver.cpp ├── test_url.cpp ├── timeclient.cpp ├── timeserver.cpp ├── tlsclient.cpp ├── tlsserver.cpp ├── udpclient.cpp ├── udpserver.cpp ├── unbind_pipe_client.cpp ├── unbind_pipe_server.cpp ├── webclient.cpp ├── webserver.cpp ├── wsclient.cpp ├── wsclient1.cpp ├── wssclient.cpp ├── wsserver.cpp └── wssserver.cpp /.github/workflows/c-cpp.yml: -------------------------------------------------------------------------------- 1 | name: C/C++ CI 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | 17 | - name: Setup C++ environment 18 | uses: kurocha/setup-cpp@v1 19 | - name: Init Submodules 20 | run: git submodule init && git submodule update --recursive && git submodule sync 21 | - name: Build 22 | run: ./build.sh 23 | 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | 34 | CMakeFiles 35 | cmake_install.cmake 36 | CMakeCache.txt 37 | env.cmake 38 | Makefile 39 | .DS_Store 40 | build 41 | opt/asio-1.18.0 42 | opt/fmt-7.0.3 43 | bin 44 | 45 | *.swp 46 | .vscode 47 | *.log 48 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "opt/asio"] 2 | path = opt/asio 3 | url = https://github.com/chriskohlhoff/asio.git 4 | [submodule "opt/fmt"] 5 | path = opt/fmt 6 | url = https://github.com/fmtlib/fmt.git 7 | [submodule "opt/klog"] 8 | path = opt/klog 9 | url = https://github.com/cageq/klog 10 | [submodule "opt/spdlog"] 11 | path = opt/spdlog 12 | url = https://github.com/gabime/spdlog.git 13 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | 4 | cd opt 5 | #tar zxf spdlog-1.11.0.tar.gz 6 | #tar jxf asio-1.24.0.tar.bz2 7 | #unzip -o fmt-9.1.0.zip 8 | tar zxvf llhttp-v6.0.5.tgz 9 | 10 | cd .. 11 | 12 | cmake . 13 | make -j4 14 | -------------------------------------------------------------------------------- /deps/asio/LICENSE_1_0.txt: -------------------------------------------------------------------------------- 1 | Boost Software License - Version 1.0 - August 17th, 2003 2 | 3 | Permission is hereby granted, free of charge, to any person or organization 4 | obtaining a copy of the software and accompanying documentation covered by 5 | this license (the "Software") to use, reproduce, display, distribute, 6 | execute, and transmit the Software, and to prepare derivative works of the 7 | Software, and to permit third-parties to whom the Software is furnished to 8 | do so, all subject to the following: 9 | 10 | The copyright notices in the Software and this entire statement, including 11 | the above license grant, this restriction and the following disclaimer, 12 | must be included in all copies of the Software, in whole or in part, and 13 | all derivative works of the Software, unless such copies or derivative 14 | works are solely in the form of machine-executable object code generated by 15 | a source language processor. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 20 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 21 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 22 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /deps/asio/asio/associator.hpp: -------------------------------------------------------------------------------- 1 | // 2 | // associator.hpp 3 | // ~~~~~~~~~~~~~~ 4 | // 5 | // Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 | // 7 | // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 | // 10 | 11 | #ifndef ASIO_ASSOCIATOR_HPP 12 | #define ASIO_ASSOCIATOR_HPP 13 | 14 | #if defined(_MSC_VER) && (_MSC_VER >= 1200) 15 | # pragma once 16 | #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) 17 | 18 | #include "asio/detail/config.hpp" 19 | 20 | #include "asio/detail/push_options.hpp" 21 | 22 | namespace asio { 23 | 24 | /// Used to generically specialise associators for a type. 25 | template