- 作者
- 赵曦
- 日期
- 2025/09/25
- 版本
- 1.0
上一篇教程:串口通信模块
下一篇教程:网络、应用层设施
1 Socket 基础
Socket 是网络通信的基本操作单元,提供了应用层与传输层之间的接口。Socket 可以分为多种类型,最常见的有流式套接字(TCP)和数据报套接字(UDP)。RMVL 提供了跨平台的 Socket 实现,并提供了协程支持,Windows 下基于 Winsock2 实现,Linux 下基于 BSD Socket 实现。
2 用法
相关类:
一般工程使用中,对于流式 Socket 推荐客户端使用同步阻塞方式进行通信,服务端使用异步非阻塞方式进行通信,以兼顾高并发性能。对于数据报式 Socket,则根据具体需求选择同步或异步方式,例如在多播场景下,使用同步阻塞的 Listener 和 Sender 即可实现绝大部分功能。
2.1 同步阻塞
下面展示了流式 Socket 的同步阻塞用法。
服务端
int main() {
auto socket = acceptor.accept();
std::string request = socket.read();
if (request.empty()) {
printf("Read failed\n");
return -1;
}
printf("Received: %s\n", request.c_str());
bool success = socket.write("response");
if (!success) {
printf("Write failed\n");
return -1;
}
}
Socket 接受器
定义 socket.hpp:510
Protocol v4()
构造端点,以表示 IPv4 TCP 协议
以及基于 socket 的同步/异步 IPC 通信、传输层与会话层通信框架
客户端
int main() {
auto socket = connector.connect();
bool success = socket.write("request");
if (!success) {
printf("Write failed\n");
return -1;
}
std::string response = socket.read();
if (response.empty()) {
printf("Read failed\n");
return -1;
}
printf("Received: %s\n", response.c_str());
}
Socket 连接器
定义 socket.hpp:549
2.2 异步非阻塞
下面展示了流式 Socket 的异步非阻塞用法。
服务端
std::string request =
co_await socket.
read();
if (request.empty()) {
printf("Read failed\n");
co_return;
}
printf("Received: %s\n", request.c_str());
bool success =
co_await socket.
write(
"response");
if (!success) {
printf("Write failed\n");
co_return;
}
}
int main() {
while (true) {
auto socket = co_await acceptor.accept();
co_spawn(io_context, session, std::move(socket));
}
});
}
异步流式 Socket 接受器
定义 socket.hpp:836
异步 I/O 执行上下文,负责管理 IO 事件循环和协程任务的调度
定义 async.hpp:177
由 rm::async::Acceptor 建立的流式 Socket 异步会话
定义 socket.hpp:746
SocketReadAwaiter read()
异步读取已连接的 Socket 中的数据
定义 socket.hpp:788
SocketWriteAwaiter write(std::string_view data)
异步写入数据到已连接的 Socket 中
定义 socket.hpp:821
保有 rm::async::Promise 的异步协程任务
定义 async.hpp:146
void co_spawn(IOContext &ctx, Callable &&fn, Args &&...args)
在指定的执行上下文中生成并调度一个协程任务
定义 async.hpp:265
客户端
auto socket =
co_await connector.
connect();
bool success =
co_await socket.
write(
"request");
if (!success) {
printf("Write failed\n");
co_return;
}
std::string response =
co_await socket.
read();
if (response.empty()) {
printf("Read failed\n");
co_return;
}
printf("Received: %s\n", response.c_str());
}
int main() {
co_spawn(io_context, session, std::ref(connector));
}
异步流式 Socket 连接器
定义 socket.hpp:886
ConnectAwaiter connect()
异步连接
定义 socket.hpp:925
2.3 Socket 控制选项
Socket 类提供了一些控制选项,用于配置 Socket 的行为,例如设置监听方的多播选项等
同步数据报式 Socket 监听器
定义 socket.hpp:418
加入多播组控制选项
定义 socket.hpp:139
多播环回控制选项
定义 socket.hpp:126
Protocol v4()
构造端点,以表示 IPv4 UDP 协议
以及发送方的多播选项
同步数据报式 Socket 发送器
定义 socket.hpp:379
Outbound 多播接口设置选项
定义 socket.hpp:108