CARLA
 
载入中...
搜索中...
未找到
listener.cpp
浏览该文件的文档.
1// Copyright (c) 2022 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
9
10#include <boost/asio/post.hpp>
11
12#include "carla/Logging.h"
13
14#include <memory>
15
16namespace carla {
17namespace multigpu {
18
19// Listener类负责监听网络连接,并管理会话
20class Listener {
21public:
22 // 构造函数,初始化监听器并开始监听指定端口
23 Listener(boost::asio::io_context &io_context, endpoint ep);
24
25 // 析构函数,停止监听器并关闭相关资源
26 ~Listener();
27
28 // 停止监听器,关闭acceptor,并重置io_context
29 void Stop();
30
31 // 打开一个新的会话,设置超时时间和回调函数
32 void OpenSession(
33 time_duration timeout,
34 callback_function_type on_opened,
35 callback_function_type on_closed,
37
38private:
39 boost::asio::io_context &_io_context; // 引用io_context对象
40 boost::asio::ip::tcp::acceptor _acceptor; // 用于接受连接的acceptor
41 time_duration _timeout; // 超时时间设置
42};
43
44// Listener类的构造函数实现
45Listener::Listener(boost::asio::io_context &io_context, endpoint ep)
46 : _io_context(io_context),
47 _acceptor(_io_context, std::move(ep)),
48 _timeout(time_duration::seconds(1u)) {
49 _acceptor.listen(); // 开始监听端口
50}
51
52// Listener类的析构函数实现
56
57// Listener类的Stop方法实现
59 _acceptor.cancel(); // 取消当前操作
60 _acceptor.close(); // 关闭acceptor
61 _io_context.stop(); // 停止io_context的事件处理
62 _io_context.reset(); // 重置io_context到初始状态
63}
64
65// Listener类的OpenSession方法实现
67 time_duration timeout,
68 callback_function_type on_opened,
69 callback_function_type on_closed,
71 using boost::system::error_code;
72
73 // 创建Primary对象代表一个会话
74 auto session = std::make_shared<Primary>(_io_context, timeout, *this);
75 auto self = shared_from_this(); // 获取Listener的shared_ptr引用
76
77 // 定义lambda函数处理accept操作的结果
78 auto handle_query = [on_opened, on_closed, on_response, session, self](const error_code &ec) {
79 if (!ec) {
80 // 如果accept成功,打开会话并设置回调函数
81 session->Open(std::move(on_opened), std::move(on_closed), std::move(on_response));
82 } else {
83 // 如果失败,记录错误信息
84 log_error("Secondary server:", ec.message());
85 }
86 };
87
88 _acceptor.async_accept(session->_socket, [=](error_code ec) {
89 // 处理查询并立刻开启一个新会话。
90 boost::asio::post(_io_context, [=]() { handle_query(ec); });
91 OpenSession(timeout, on_opened, on_closed, on_response);
92 });
93}
94
95} // namespace multigpu
96} // namespace carla
警告:在它的io_context停止之前,这个服务器不能被销毁。
Definition listener.cpp:20
boost::asio::io_context & _io_context
Definition listener.cpp:39
boost::asio::ip::tcp::endpoint endpoint
Definition listener.h:29
boost::asio::ip::tcp::acceptor _acceptor
Definition listener.cpp:40
std::function< void(std::shared_ptr< Primary >)> callback_function_type
Definition listener.h:32
std::function< void(std::shared_ptr< Primary >, carla::Buffer)> callback_function_type_response
Definition listener.h:33
Listener(boost::asio::io_context &io_context, endpoint ep)
Definition listener.cpp:45
void OpenSession(time_duration timeout, callback_function_type on_opened, callback_function_type on_closed, callback_function_type_response on_response)
Definition listener.cpp:66
Positive time duration up to milliseconds resolution.
Definition Time.h:19
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
static void log_error(Args &&... args)
Definition Logging.h:115