增强检查通过UDP接收的IP地址是否为本地IP地址

时间:2015-05-06 08:29:08

标签: c++ boost boost-asio

如何从自身中覆盖通过广播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.

谢谢!

1 个答案:

答案 0 :(得分:0)

据我所知,没有便携式解决方案。您定位的平台是什么?在最近的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和所有,你可能需要调整它。