mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-04-27 11:17:49 +02:00
Add bind to network interface option
This commit is contained in:
parent
14f2b24b16
commit
f88f68f248
4 changed files with 86 additions and 13 deletions
48
util.cpp
48
util.cpp
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue