在设置服务器-客户端配置时,需要创建一个 TCPv4TransportDescriptor
(用于 TCPv4)或 TCPv6TransportDescriptor
(用于 TCPv6)的实例,并将其添加到 DomainParticipant 的用户传输列表中。根据 TCP 传输描述符的设置和定义的网络定位器,DomainParticipant 可以作为 TCP 服务器或 TCP 客户端工作。
TCP 服务器
如果在描述符中提供了 listening_ports
,则 DomainParticipant 将充当 TCP 服务器,监听来自远程连接的请求。以下是 C++ 代码和 XML 文件中的示例:
C++ 示例:
eprosima::fastdds::dds::DomainParticipantQos qos;
// 创建新传输的描述符
auto tcp_transport = std::make_shared<eprosima::fastdds::rtps::TCPv4TransportDescriptor>();
tcp_transport->add_listener_port(5100); // 设置监听端口
// [可选] 配置线程设置
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};
// 将传输层链接到参与者
qos.transport().user_transports.push_back(tcp_transport);
// 禁用默认传输
qos.transport().use_builtin_transports = false;
// [可选] 设置单播定位器
eprosima::fastdds::rtps::Locator_t locator;
locator.kind = LOCATOR_KIND_TCPv4;
eprosima::fastdds::rtps::IPLocator::setIPv4(locator, "192.168.1.10");
eprosima::fastdds::rtps::IPLocator::setPhysicalPort(locator, 5100);
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);
TCP 客户端
如果向 DomainParticipant 提供 initialPeersList
,它将作为 TCP 客户端尝试连接到给定地址和端口的远程服务器。以下是 C++ 和 XML 文件中的示例:
C++ 示例:
eprosima::fastdds::dds::DomainParticipantQos qos;
// 禁用内置传输层
qos.transport().use_builtin_transports = false;
// 创建新传输的描述符,不配置任何监听端口
auto tcp_transport = std::make_shared<eprosima::fastdds::rtps::TCPv4TransportDescriptor>();
qos.transport().user_transports.push_back(tcp_transport);
// [可选] 配置线程设置
tcp_transport->default_reception_threads(eprosima::fastdds://{ ThreadSettings{-1 , 0 , 0 ,-1} });
tcp_transport->set_thread_config_for_port(12345,e prosima :: fast dds :: rtps :: ThreadSettings {-1 , 0 , 0 ,-1 });
tcp_transport -> keep_alive_thread = e prosima :: fast dds :: rtps :: ThreadSettings {-1 , + the role } ; // [-目标位置}
transport ) ;
// 设置初始对等体。
e pros ima : : fast dds : : rt p s : : Locator_t initial_peer_locator;
initial_peer_locator.kind=LOCATOR_KIND_TCPV4;
e pros ima: : fast dds: : r t ps: IP Locator :: setIPv4(initial_peer_locator,"192 .168 .10 ");
}
}
注意事项
手动设置单播定位器是可选的。如果不设置它们或将它们与逻辑端口设置为零,则客户端的初始对等体不应设置其逻辑端口(或将其设为零)。否则,初始对等体的逻辑端口必须与服务器的单播逻辑端口匹配。
以上说明展示了如何使用和配置 TCP 传输,以支持复杂的数据交换场景。通过合理配置,可以实现可靠的数据通信。
内容由零声教学AI助手提供,问题来源于学员提问