Add bind to network interface option

This commit is contained in:
Jeff Becker 2016-06-29 11:06:51 -04:00
parent 14f2b24b16
commit f88f68f248
No known key found for this signature in database
GPG key ID: AB950234D6EA286B
4 changed files with 86 additions and 13 deletions

View file

@ -413,7 +413,53 @@ namespace net
return GetMTUUnix(localAddress, fallback);
#endif
return fallback;
}
}
const boost::asio::ip::address GetInterfaceAddress(const std::string & ifname, bool ipv6)
{
#ifdef WIN32
LogPrint(eLogError, "NetIface: cannot get address by interface name, not implemented on WIN32");
return boost::asio::ip::from_string("127.0.0.1");
#else
int af = (ipv6 ? AF_INET6 : AF_INET);
ifaddrs * addrs = nullptr;
if(getifaddrs(&addrs) == 0)
{
// got ifaddrs
ifaddrs * cur = addrs;
while(cur)
{
std::string cur_ifname(cur->ifa_name);
if (cur_ifname == ifname && cur->ifa_addr->sa_family == af)
{
// match
size_t sz = (ipv6 ? INET6_ADDRSTRLEN : INET_ADDRSTRLEN);
char * addr = new char[sz];
addr[sz-1] = 0;
socklen_t sl = (ipv6 ? sizeof(sockaddr_in6) : sizeof(sockaddr_in));
// this probably won't screw up (right?)
inet_ntop(af, cur->ifa_addr, addr, sl);
std::string cur_ifaddr(addr);
delete [] addr;
freeifaddrs(addrs);
return boost::asio::ip::address::from_string(cur_ifaddr);
}
cur = cur->ifa_next;
}
}
if(addrs) freeifaddrs(addrs);
std::string fallback;
if(ipv6) {
fallback = "::";
LogPrint(eLogWarning, "NetIface: cannot find ipv6 address for interface ", ifname);
} else {
fallback = "127.0.0.1";
LogPrint(eLogWarning, "NetIface: cannot find ipv4 address for interface ", ifname);
}
return boost::asio::ip::address::from_string(fallback);
#endif
}
}
} // util