这段代码用于配置eProsima Fast DDS中的一个DomainParticipant
,并设置TCPv4传输层的参数,以便在网络中进行数据传输。下面是对每一部分的详细解释:
1. 创建QoS对象
eprosima::fastdds::dds::DomainParticipantQos qos;
创建一个DomainParticipantQos
对象,用于配置参与者的质量服务(QoS)属性。
2. 创建传输描述符
auto tcp_transport = std::make_shared<eprosima::fastdds::rtps::TCPv4TransportDescriptor>();
tcp_transport->add_listener_port(5100);
tcp_transport->set_WAN_address("80.80.99.45");
TCPv4TransportDescriptor
是Fast DDS中用于定义TCP协议的传输层描述符。add_listener_port(5100)
:将5100端口添加为监听端口,即该参与者将在此端口接收连接请求。set_WAN_address("80.80.99.45")
:设置公共WAN地址,使得外部客户端能够通过这个地址与服务器通信。
3. (可选)线程设置配置
tcp_transport->default_reception_threads(eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1});
tcp_transport->set_thread_config_for_port(12345, eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1});
tcp_transport->keep_alive_thread = eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1};
tcp_transport->accept_thread = eprosima::fastdds::rtps::ThreadSettings{-1, 0, 0, -1};
这些行配置了与传输相关的线程设置,包括默认接收线程、特定端口的线程配置以及保持活动和接受连接的线程。这些是可选项,可以根据需要调整以优化性能。
4. 将传输层链接到参与者
qos.transport().user_transports.push_back(tcp_transport);
qos.transport().use_builtin_transports = false;
- 将刚才创建的TCP传输描述符添加到参与者的用户自定义传输列表中。
- 设置不使用内置传输,以确保只使用自定义的TCP transport。
5. 设置单播定位器(Locators)
eprosima::fastdds::rtps::Locator_t locator;
locator.kind = LOCATOR_KIND_TCPv4;
// [RECOMMENDED] Use the LAN address of the server
eprosima::fastdds::rtps::IPLocator::setIPv4(locator, "192.168.1.10");
// [ALTERNATIVE] Use server's WAN address.
// eprosima::fastdds::rtps::IPLocator::setIPv4(locator, "80.80.99.45");
eprosima::fastdds::rtps::IPLocator::setPhysicalPort(locator, 5100);
// [OPTIONAL] Logical port default value is 0.
eprosima::fastdds::rtps::IPLocator ::setLogicalPort(locator, 5100);
qos.wire_protocol().builtin.metatrafficUnicastLocatorList.push_back(locator);
qos.wire_protocol().default_unicast_locator_list.push_back(locator);
这里首先定义了一个单播定位器,并指定它为TCPv4类型。可以选择使用LAN地址或WAN地址:
- 推荐:使用局域网地址(如”192.168.1.10”),适合同一局域网内通信。
- 替代:使用公共WAN地址(如”80.80.99.45”),适合需要跨越广域网进行通信时使用,但要确保初始对等体仅通过此WAN地址进行连接。
然后设置物理和逻辑端口,并将其添加到QoS对象中,以便Fast DDS在建立连接时知道如何找到这个参与者。
为什么用两个IP地址?
LAN地址:通常在本地网络中通信,适合在同一局域网中的设备间进行低延迟、高速的数据交换。如果两个节点都在同一网络上,则优先选择LAN IP,这样可以避免不必要的网络延迟。
WAN地址:当设备位于不同网络或需要从外部访问时,需要使用公用IP(WAN IP)。例如,如果有远程客户端希望与服务器交互,而不是通过内部网络,则必须使用WAN IP。同时,由于路由和防火墙的问题,某些情况下可能只允许特定公网IP进行访问,所以会要求将初始对等体配置成指向这个公用IP。
总之,提供两种选择可以灵活应对不同的网络环境需求。
内容由零声教学AI助手提供,问题来源于学员提问