【FastDDS】Layer Transport ( 03-UDP Transport )

UDP 传输

一、概述

UDP 是一种无连接的传输方式,在这种传输方式中,接收端的域参与者必须打开一个 UDP 端口以监听传入的消息,而发送端的域参与者则向该端口发送消息。

警告:本文档假设读者具备基本的 UDP/IP 概念知识,因为像生存时间(TTL)、套接字缓冲区和端口编号等术语不会被详细解释。不过,即使没有这些知识,也可以在 Fast DDS 上配置基本的 UDP 传输。

二、UDPTransportDescriptor

eProsima Fast DDS 为 UDPv4 和 UDPv6 都实现了 UDP 传输。这两种传输彼此独立,各有自己的 TransportDescriptorInterface。不过,它们所有的 TransportDescriptorInterface 数据成员都是相同的。

下表描述了 UDPv4 和 UDPv6 共有的数据成员:

成员数据类型默认值描述
sendBufferSizeuint32_t0套接字的发送缓冲区大小(字节)。
receiveBufferSizeuint32_t0套接字的接收缓冲区大小(字节)。
netmask_filterNetmaskFilterKindAUTO参见网络掩码过滤。
allowlistvector<pair<string,NetmaskFilterKind>>空向量带有网络掩码过滤配置的允许接口列表。参见允许列表。
blocklistvector<string>空向量被阻塞的接口列表。参见阻塞列表。
interfaceWhiteListvector<string>空向量允许的接口列表。参见接口白名单。
TTLuint8_t1生存时间,以跳数为单位。
m_output_udp_socketuint16_t0传出消息的端口号。
non_blocking_sendboolfalse发送操作不阻塞(*)。
default_reception_threadsThreadSettings-接收线程的默认线程设置。
reception_threadsstd::map<uint32_t,ThreadSettings>-特定端口上接收线程的线程设置。

注意:当 non_blocking_send 设置为 true 时,如果缓冲区已满,发送操作将立即返回,但不会向上层返回错误。这意味着应用程序会表现得好像数据报已发送但丢失了。这个值在高频的尽力而为型写入器上特别有用。当设置为 false 时,发送操作将阻塞,直到网络缓冲区有空间容纳数据报。这可能会影响高频写入器的性能。

2.1 UDPv4TransportDescriptor

UDPv4TransportDescriptor 没有除 UDPTransportDescriptor 中描述的共有成员之外的其他数据成员。

注意UDPv4TransportDescriptorkind 值由 LOCATOR_KIND_UDPv4 给出。

2.2 UDPv6TransportDescriptor

UDPv6TransportDescriptor 没有除 UDPTransportDescriptor 中描述的共有成员之外的其他数据成员。

注意UDPv6TransportDescriptorkind 值由 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>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ray.so

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值