【问题标题】:Boost check if the ip address received through UDP is the local oneBoost 检查通过 UDP 接收到的 ip 地址是否是本地的
【发布时间】:2015-07-16 06:34:11
【问题描述】:

我怎样才能绕过来自自己的广播 UDP 消息? 我需要绕过来自同一服务器的 udp 请求(发送广播时)。如何获取当前IP地址? 这是我尝试过的,但我得到了 127.0.1.1,这不是来自正确接口的 IP 地址:

 tcp::resolver resolver(mIoService);
 tcp::resolver::query query(boost::asio::ip::host_name(), "");
 tcp::resolver::iterator iter = resolver.resolve(query);
 tcp::resolver::iterator end; // End marker.

谢谢!

【问题讨论】:

  • 不是,在那些回答里有使用互联网的解决方案,但是我不想使用这种方法,我想在局域网中使用该程序。

标签: c++ boost boost-asio


【解决方案1】:

据我所知,没有便携式解决方案。你的目标是什么平台?在最新的 Unix 上,您可能应该使用 ifaddrs,这是一个(非常)虚拟的示例:

#include <ifaddrs.h>
#include <iostream>
#include <netinet/in.h>
#include <sstream>
#include <sys/types.h>

int
main()
{
  ifaddrs* ifap = 0;
  if (getifaddrs(&ifap) != 0)
    return 1;
  for (ifaddrs* iter = ifap; iter != nullptr; iter = iter->ifa_next)
    {
      std::ostringstream oss;
      uint8_t* tab;
      sockaddr_in* inet_addr;
      if (iter->ifa_addr->sa_family == AF_INET)
        {
          inet_addr = reinterpret_cast<sockaddr_in*>(iter->ifa_addr);
          tab = reinterpret_cast<uint8_t*>(&inet_addr->sin_addr.s_addr);
          for (size_t i = 0; i < sizeof(inet_addr->sin_addr.s_addr); ++i)
            {
              if (i != 0)
                oss << '.';
              oss << static_cast<unsigned int>(tab[i]);
            }
          std::cerr << oss.str() << std::endl;
        }
    }
  freeifaddrs(ifap);
}

这假设 ipv4 和所有,你可能需要适应它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2019-10-30
    • 2016-08-28
    • 2012-11-28
    相关资源
    最近更新 更多