15.11. Dynamic Network Interfaces
DDS简单发现依赖于众所周知的多播地址和端口来转发参与者公告消息(请参见发现阶段)。该参与者公告包括有关单播地址-端口对(即定位符)的信息,参与者期望在这些地址上接收传入的元流量数据。此单播定位符列表是在启用Fast DDS DomainParticipant时自动初始化的,考虑到可用的网络接口。因此,任何在启用DomainParticipant之后添加的网络接口都应该通知Fast DDS,以便在该网络中初始化一个单播定位符,从而建立通过该新接口的通信。
15.11.1. 动态网络接口运行时添加
如果用户希望在运行时添加新的网络接口,则需要满足一些先决条件。一旦可用,该用户可以通知Fast DDS,以便这些接口也被用于通信。
15.11.1.1. 先决条件
此功能旨在用于Fast DDS自动设置监听单播定位符的情况。因此,metatrafficUnicastLocatorList
和metatrafficMulticastLocatorList
这两个列表必须为空。这些属性是在DomainParticipantQos中的wire_protocol()内置成员中设置的(请参阅DomainParticipantQos)。
注意:请注意DomainParticipantQos中设定的远程定位符集合限制(请参阅RemoteLocatorsAllocationAttributes)。建议使用同一域下所有系统发现的最高数量的本地地址。
15.11.1.2. 通知Fast DDS
一旦新的网络接口被启用,就必须手动通知Fast DDS。这是通过调用DomainParticipant::set_qos()
来完成的。传递给该方法的DomainParticipantQoS可以更改其中一个可变DomainParticipant QoS,也可以简单地是当前DomainParticipant QoS(通过DomainParticipant::get_qos()
获取)。
使用DomainParticipant::set_qos()
就是上述先决条件存在原因:一旦启用了DomainParticipant,有几个QoS策略是不可变更且无法在运行时修改。其中定义了前面提到列表的WireProtocolConfigQos就是这些不可变政策之一。
以下是如何使用此功能的一段简要代码示例:
// 创建 DomainParticipant
DomainParticipant* participant =
DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
if (nullptr == participant)
{
// 错误处理
return;
}
// 用户应用程序代码...
// 通知 Fast DDS 新网络接口已启用
participant->set_qos(PARTICIPANT_QOS_DEFAULT);
重要提示:此功能仍在开发中,仅对没有白名单限制的UDPv4传输正式支持。
内容由零声教学AI助手提供,问题来源于学员提问