找出std :: string中存储的主机名是IP地址还是C ++中的FQDN地址

问题描述 投票:0回答:1

是否可以使用c ++中的boost lib来找到一个字符串是FQDN还是IP地址。我尝试了下面的代码,该代码对于IP地址正常工作,但在FQDN的情况下会引发异常。

// getHostname returns IP address or FQDN
std::string getHostname()
{
  // some work and find address and return
  return hostname;
}

bool ClassName::isAddressFqdn()
{
  const std::string hostname = getHostname();
  boost::asio::ip::address addr;
  addr.from_string(hostname.c_str());
  //addr.make_address(hostname.c_str()); // make_address does not work in my boost version

  if ((addr.is_v6()) || (addr.is_v4()))
  {
    std::cout << ":: IP address : " << hostname << std::endl;
    return false;
  }

  // If address is not an IPv4 or IPv6, then consider it is FQDN hostname
  std::cout << ":: FQDN hostname: " << hostname << std::endl;
  return true;
}

在FQDN的情况下失败,因为在FQDN的情况下boost :: asio :: ip :: address引发异常。

我也尝试过搜索相同的内容,在python中类似的内容是可用的,但我在c ++中需要。

c++11 boost-asio ip-address fqdn
1个回答
0
投票

我依靠inet_pton告诉我字符串是否实际上是IP地址。否则,假定它是主机名。

bool IsIpAddress(const char* address)
{
    sockaddr_in addr4 = {};
    sockaddr_in6 addr6 = {};

    int result4 = inet_pton(AF_INET, address, (void*)(&addr4));
    int result6 = inet_pton(AF_INET6, address, (void*)(&addr6));

    return ((result4 == 1) || (result6 == 1));
}

bool isAddressFqdn(const char* address)
{
    return !IsIpAddress(address);
}
© www.soinside.com 2019 - 2024. All rights reserved.