Вы вводите тип addrinfo
на sockaddr_in
, что неправильно. addrinfo
само по себе не является sockaddr_in
, но может указать на sockaddr_in
. getaddrinfo()
возвращает связанный список из 1 или более структур addrinfo
, каждая из которых указывает на соответствующую структуру sockaddr_...
в своем поле ai_addr
. Вам нужно перебрать этот список, используя каждую из этих структур по мере необходимости.
Кроме того, вы используете AF_UNSPEC
с полем hints.ai_protocol
, но это не значение протокола, его следует использовать только с поле hints.ai_family
. Допустимое значение ai_protocol
для сокета SOCK_DGRAM
будет, например, IPPROTO_UDP
. Просто так получается, что AF_UNSPEC
имеет значение 0, а установка hints.ai_protocol
на 0 указывает getaddrinfo()
возвращать адреса для любого протокола.
Попробуйте вместо этого:
addrinfo hints, *addrs;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
int result = getaddrinfo("192.168.178.68", "5642", &hints, &addrs);
if (result != 0) {
throw "Please create an exception here";
}
for(auto addr = addrs; addr != nullptr; addr = addr->ai_next)
{
auto in4 = reinterpret_cast<sockaddr_in*>(addr->ai_addr);
std::cout << in4->sin_family << std::endl
<< inet_ntoa(in4->sin_addr) << std::endl
<< ntohs(in4->sin_port) << std::endl;
}
freeaddrinfo(addrs);
При этом, если вы установите hints.ai_family
на AF_UNSPEC
, тогда getaddrinfo()
может вернуть список, содержащий EITHER sockaddr_in
ИЛИ sockaddr_in6
структур , ИЛИ ОБА :
addrinfo hints, *addrs;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = IPPROTO_UDP;
int result = getaddrinfo("192.168.178.68", "5642", &hints, &addrs);
if (result != 0) {
throw "Please create an exception here";
}
char ipaddrbuf[46];
for(auto addr = addrs; addr != nullptr; addr = addr->ai_next)
{
switch (addr->ai_family /* or: addr->ai_addr->sa_family */ )
{
case AF_INET:
{
auto in4 = reinterpret_cast<sockaddr_in*>(addr->ai_addr);
std::cout << in4->sin_family << std::endl
<< inet_ntop(AF_INET, &(in4->sin_addr), ipaddrbuf, sizeof(ipaddrbuf)) << std::endl
<< ntohs(in4->sin_port) << std::endl;
break;
}
case AF_INET6:
{
auto in6 = reinterpret_cast<sockaddr_in6*>(addr->ai_addr);
std::cout << in6->sin6_family << std::endl
<< inet_ntop(AF_INET6, &(in6->sin6_addr), ipaddrbuf, sizeof(ipaddrbuf)) << std::endl
<< ntohs(in6->sin6_port) << std::endl;
break;
}
}
}
freeaddrinfo(addrs);