UDP 传输
一、概述
UDP 是一种无连接的传输方式,在这种传输方式中,接收端的域参与者必须打开一个 UDP 端口以监听传入的消息,而发送端的域参与者则向该端口发送消息。
警告:本文档假设读者具备基本的 UDP/IP 概念知识,因为像生存时间(TTL)、套接字缓冲区和端口编号等术语不会被详细解释。不过,即使没有这些知识,也可以在 Fast DDS 上配置基本的 UDP 传输。
二、UDPTransportDescriptor
eProsima Fast DDS 为 UDPv4 和 UDPv6 都实现了 UDP 传输。这两种传输彼此独立,各有自己的 TransportDescriptorInterface。不过,它们所有的 TransportDescriptorInterface 数据成员都是相同的。
下表描述了 UDPv4 和 UDPv6 共有的数据成员:
| 成员 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
sendBufferSize | uint32_t | 0 | 套接字的发送缓冲区大小(字节)。 |
receiveBufferSize | uint32_t | 0 | 套接字的接收缓冲区大小(字节)。 |
netmask_filter | NetmaskFilterKind | AUTO | 参见网络掩码过滤。 |
allowlist | vector<pair<string,NetmaskFilterKind>> | 空向量 | 带有网络掩码过滤配置的允许接口列表。参见允许列表。 |
blocklist | vector<string> | 空向量 | 被阻塞的接口列表。参见阻塞列表。 |
interfaceWhiteList | vector<string> | 空向量 | 允许的接口列表。参见接口白名单。 |
TTL | uint8_t | 1 | 生存时间,以跳数为单位。 |
m_output_udp_socket | uint16_t | 0 | 传出消息的端口号。 |
non_blocking_send | bool | false | 发送操作不阻塞(*)。 |
default_reception_threads | ThreadSettings | - | 接收线程的默认线程设置。 |
reception_threads | std::map<uint32_t,ThreadSettings> | - | 特定端口上接收线程的线程设置。 |
注意:当
non_blocking_send设置为true时,如果缓冲区已满,发送操作将立即返回,但不会向上层返回错误。这意味着应用程序会表现得好像数据报已发送但丢失了。这个值在高频的尽力而为型写入器上特别有用。当设置为false时,发送操作将阻塞,直到网络缓冲区有空间容纳数据报。这可能会影响高频写入器的性能。
2.1 UDPv4TransportDescriptor
UDPv4TransportDescriptor 没有除 UDPTransportDescriptor 中描述的共有成员之外的其他数据成员。
注意:
UDPv4TransportDescriptor的kind值由LOCATOR_KIND_UDPv4给出。
2.2 UDPv6TransportDescriptor
UDPv6TransportDescriptor 没有除 UDPTransportDescriptor 中描述的共有成员之外的其他数据成员。
注意:
UDPv6TransportDescriptor的kind值由LOCATOR_KIND_UDPv6给出。
三、启用 UDP 传输
Fast DDS 默认启用 UDPv4 传输。不过,如果需要,应用程序可以启用其他 UDP 传输。要在域参与者中启用新的 UDP 传输,首先创建 UDPv4TransportDescriptor(用于 UDPv4)或 UDPv6TransportDescriptor(用于 UDPv6)的实例,并将其添加到域参与者的用户传输列表中。
下面的示例展示了在 C++ 代码和 XML 文件中执行此过程的方法。
3.1 C++ 代码示例
DomainParticipantQos qos;
// 创建新传输的描述符
auto udp_transport = std::make_shared<UDPv4TransportDescriptor>();
udp_transport->sendBufferSize = 9216;
udp_transport->receiveBufferSize = 9216;
udp_transport->non_blocking_send = true;
// [可选] 线程设置配置
udp_transport->default_reception_threads(eprosima::fastdds::rtps::ThreadSettings{2, 2, 2, 2});
udp_transport->set_thread_config_for_port(12345, eprosima::fastdds::rtps::ThreadSettings{3, 3, 3, 3});
// 将传输层链接到参与者
qos.transport().user_transports.push_back(udp_transport);
// 避免使用默认传输
qos.transport().use_builtin_transports = false;
3.2 XML 文件示例
<?xml version="1.0" encoding="UTF-8" ?>
<dds>
<profiles xmlns="http://www.eprosima.com">
<transport_descriptors>
<transport_descriptor>
<transport_id>udp_transport</transport_id>
<type>UDPv4</type>
<sendBufferSize>9216</sendBufferSize>
<receiveBufferSize>9216</receiveBufferSize>
<non_blocking_send>true</non_blocking_send>
<default_reception_threads>
<scheduling_policy>2</scheduling_policy>
<priority>2</priority>
<affinity>2</affinity>
<stack_size>2</stack_size>
</default_reception_threads>
<reception_threads>
<reception_thread port="12345">
<scheduling_policy>3</scheduling_policy>
<priority>3</priority>
<affinity>3</affinity>
<stack_size>3</stack_size>
</reception_thread>
</reception_threads>
</transport_descriptor>
</transport_descriptors>
<participant profile_name="UDPParticipant">
<rtps>
<userTransports>
<transport_id>udp_transport</transport_id>
</userTransports>
<useBuiltinTransports>false</useBuiltinTransports>
</rtps>
</participant>
</profiles>
<dds>
309

被折叠的 条评论
为什么被折叠?



