RTI Connext DDS内置的自动发现功能是其与其他网络中间件实现不同的一种重要方式。
默认情况下,Connext DDS应用程序使用共享内存或UDP环回相互发现(如果它们位于同一主机上)或使用多播(如果它们位于不同主机上)。因此,要使用多播在两台或多台计算机上运行应用程序,或在具有网络连接的单台计算机上运行应用程序,则不需要进行任何更改。他们会自动发现对方。
如果要使用不支持多播的计算机(或者由于某些其他原因需要使用单播),或者如果要在没有网络连接的单台计算机上运行(在这种情况下,您的操作系统可能具有禁用您的网络堆栈),有一种简单的方法来控制发现过程 - 您甚至不必重新编译。可以通过NDDS_DISCOVERY_PEERS环境变量或QoS配置文件配置应用程序发现。
何时设置发现对等方
你必须在几种情况下设置发现对等体:
(下文中,N代表要运行的Connext DDS应用程序的数量。)
1.如果你不能使用组播:
将发现对等方设置为需要相互发现的所有主机的列表。该列表可以包含主机名和/或IP地址;每个条目的格式应为N@bulitin.udpv4://<hostname|IP>。
2.如果您没有网络连接:
某些操作系统(例如,Microsoft Windows)在检测到没有可用的网络接口时禁用其网络堆栈的某些功能。当应用程序尝试打开网络连接时,这可能会导致问题。
如果您的系统支持共享内存,请将发现对等项设置为N@builtin.shmem://。这将仅启用共享内存传输。
如果你的系统不支持共享内存(或已被禁用),设置你的发现同行的环回地址,N@builtin.udpv4://127.0.0.1。
如何设置发现对等方
如上所述,在大多数情况下,您无需显式设置发现对等体。
如果将它们设置时必需的,有两种简单的方法可以这样做:
将NDDS_DISCOVERY_PEERS环境变量设置为以逗号分隔的列表,列出需要相互发现的所有主机的名称或地址。
Windows系统上的示例:
设置NDDS_DISCOVERY_PEERS=3@builtin.udpv4://mypeerhost1,4@builtin.udpv4://mypeerhost2
使用csh或tcsh时基于UNIX的系统上的示例:
setenv NDDS_DISCOVERY_PEERS 3@builtin.udpv4://mypeerhost1,4@builtin.udpv4://mypeerhost2
在XML QoS配置文件中设置发现对等项列表。
例如,要仅打开共享内存:
<participant_qos>
<discovery>
<!--
The initial_peers list are those "addresses" to which the
middleware will send discovery announcements.
-->
<initial_peers>
<element>4@builtin.shmem://</element>
</initial_peers>
<!--
The multicast_receive_addresses list identifies where the
DomainParticipant listens for multicast announcements
from others. S et this list to an empty value to disable
listening over multicast.
-->
<multicast_receive_addresses>
<!-- empty -->
</multicast_receive_addresses>
</discovery>
<transport_builtin>
<!--
The transport_builtin mask identifies which builtin
transports the DomainParticipant uses. The default value
is UDPv4 | SHMEM, so set this mask to SHMEM to prevent
other nodes from initiating communication with this node
via UDPv4.
-->
<mask>SHMEM</mask>
</transport_builtin>
...
</participant_qos>
补充:
linux下设置环境变量:
export NDDS_DISCOVERY_PEERS=2@builtin.udpv4://192.168.1.103
echo $NDDS_DISCOVERY_PEERS
C++中设置环境变量:
#include <stdlib.h>
#include <stdio.h>
int iRet = putenv("testName=beauty");//设置环境变量
if (iRet < 0)
{
printf("error\n");
}
else
{
printf("set successfully\n");
}
const char *pEn = getenv("testName");//获取环境变量
该方法设置环境变量仅在当前进程有用