当我们创建RTPSParticipantImpl的时候,有时候会指定通信使用的网卡,将可以用于RTPS通信的网卡的IP添加到白名单中,这样,RTPS就只会在IP所在的网卡上进行PDP,EDP以及业务数据交互。
如果我们的DDS应用在启动的时候,传递了网卡白名单给RTPSParticipantImpl,但是此时,白名单IP所在的网卡有没有被创建出来,那么会触发UDPv4Transport中的一个BUG
TCPv4Transport::TCPv4Transport(
const TCPv4TransportDescriptor& descriptor)
: TCPTransportInterface(LOCATOR_KIND_TCPv4)
, configuration_(descriptor)
{
if (!descriptor.interfaceWhiteList.empty())
{
const auto white_begin = descriptor.interfaceWhiteList.begin();
const auto white_end = descriptor.interfaceWhiteList.end();
std::vector<IPFinder::info_IP> local_interfaces;
get_ipv4s(local_interfaces, true);
for (const IPFinder::info_IP& infoIP : local_interfaces)
{
if (std::find_if(white_begin, white_end, [infoIP](const std::string& white_list_element)
{
return white_list_element == infoIP.dev || white_list_element == infoIP.name;
}) != white_end )
{
interface_whitelist_.emplace_back(ip::address_v4::from_string(infoIP.name));
}
}
if (interface_whitelist_.empty())
{
EPROSIMA_LOG_ERROR(TRANSPORT, "All whitelist interfaces were filtered out");
interface_whitelist_.emplace_back(ip::address_v4::from_string("192.0.2.0"));
}
}
...
}
问题就在上面这段TCPv4Transport的构造函数中,轮询了白名单中的IP,根据IP找对应的网卡,如果没有找到网卡,则将IP从白名单中移除。最后,如果此时白名单中没有IP了(所有对应网卡都没有起来),那么会增加一条固定的IP("192.0.2.0“),也就是说后面只有当某一个网卡配置了"192.0.2.0“这个IP,才能让RTPS正常收发数据了。