userver: userver/components/tcp_acceptor_base.hpp Source File
Loading...
Searching...
No Matches
tcp_acceptor_base.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/components/tcp_acceptor_base.hpp
4/// @brief @copybrief components::TcpAcceptorBase
5
6#include <userver/components/component_base.hpp>
7#include <userver/concurrent/background_task_storage.hpp>
8#include <userver/engine/io/socket.hpp>
9#include <userver/engine/task/task.hpp>
10
11USERVER_NAMESPACE_BEGIN
12
13namespace server::net {
14struct ListenerConfig;
15}
16
17namespace components {
18
19/// @ingroup userver_base_classes userver_components
20///
21/// @brief Component for accepting incoming TCP connections.
22///
23/// Each accepted socket is processed in a new coroutine by ProcessSocket of the derived class.
24///
25/// ## Static options of components::TcpAcceptorBase :
26/// @include{doc} scripts/docs/en/components_schema/core/src/components/tcp_acceptor_base.md
27///
28/// Options inherited from @ref components::ComponentBase :
29/// @include{doc} scripts/docs/en/components_schema/core/src/components/impl/component_base.md
30///
31/// @see @ref scripts/docs/en/userver/tutorial/tcp_service.md
33public:
34 TcpAcceptorBase(const ComponentConfig&, const ComponentContext&);
35 ~TcpAcceptorBase() override;
36
37 static yaml_config::Schema GetStaticConfigSchema();
38
39protected:
40 /// Override this function to process incoming sockets.
41 ///
42 /// @warning The function is called concurrently from multiple threads on
43 /// each new socket.
44 virtual void ProcessSocket(engine::io::Socket&& sock) = 0;
45
46private:
47 TcpAcceptorBase(
48 const ComponentConfig& config,
49 const ComponentContext& context,
50 const server::net::ListenerConfig& acceptor_config
51 );
52
53 void KeepAccepting(engine::io::Socket& listen_sock);
54
55 void Start();
56 void Stop() noexcept;
57
58 struct SocketData {
59 engine::io::Socket listen_sock;
60 engine::Task acceptor;
61 };
62
63 const bool no_delay_;
64 engine::TaskProcessor& acceptor_task_processor_;
65 engine::TaskProcessor& sockets_task_processor_;
66 concurrent::BackgroundTaskStorageCore tasks_;
67 std::vector<SocketData> sockets_;
68};
69
70} // namespace components
71
72USERVER_NAMESPACE_END