|
|
|
@ -2,45 +2,6 @@ |
|
|
|
|
#include <iostream> |
|
|
|
|
|
|
|
|
|
namespace Bk::Net { |
|
|
|
|
|
|
|
|
|
std::vector<std::string> dns_lookup(const std::string &host_name, IpVersion ipv = IpVersion::IPv4) |
|
|
|
|
{ |
|
|
|
|
std::vector<std::string> output; |
|
|
|
|
|
|
|
|
|
struct addrinfo hints, *res, *p; |
|
|
|
|
int status, ai_family; |
|
|
|
|
char ip_address[INET6_ADDRSTRLEN]; |
|
|
|
|
|
|
|
|
|
ai_family = (int)ipv; |
|
|
|
|
memset(&hints, 0, sizeof hints); |
|
|
|
|
hints.ai_family = ai_family;
|
|
|
|
|
hints.ai_socktype = SOCK_STREAM; |
|
|
|
|
|
|
|
|
|
if ((status = getaddrinfo(host_name.c_str(), NULL, &hints, &res)) != 0) { |
|
|
|
|
//cerr << "getaddrinfo: "<< gai_strerror(status) << endl;
|
|
|
|
|
return output; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for(p = res;p != NULL; p = p->ai_next) { |
|
|
|
|
void *addr; |
|
|
|
|
if (p->ai_family == AF_INET) { // IPv4
|
|
|
|
|
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; |
|
|
|
|
addr = &(ipv4->sin_addr); |
|
|
|
|
} else { // IPv6
|
|
|
|
|
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr; |
|
|
|
|
addr = &(ipv6->sin6_addr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// convert the IP to a string
|
|
|
|
|
inet_ntop(p->ai_family, addr, ip_address, sizeof ip_address); |
|
|
|
|
output.push_back(ip_address); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
freeaddrinfo(res); // free the linked list
|
|
|
|
|
|
|
|
|
|
return output; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Socket::Socket(IpAddress ip, int port,IpProtocol proto) |
|
|
|
|
: ip_addr(ip), ip_proto(proto) |
|
|
|
|
{ |
|
|
|
|