inet_ntop返回不存在的地址

inet_ntop returns address that doesnt exist

本文关键字:地址 不存在 返回 ntop inet      更新时间:2023-10-16
#include <WinSock2.h>
#include <WS2tcpip.h>
#include "stdio.h"
int main(int argc, wchar_t *argv[]) {
//init Windows Sockets
//IResult
int IResult = NULL;
WSADATA wsaDataStruct;
IResult = WSAStartup(MAKEWORD(2, 2), &wsaDataStruct);
if (IResult != 0) // Error
{
//printf u are fucked;
printf("Error: Winsock2 Init, %d", IResult);
return 1;
}
//Result is output of getaddrinfo, hints is a helper struct
struct addrinfo* 
result = NULL, //Linked list of addresses
* ptr = NULL, 
hints = {};
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
//Hostname
char hostname[64] = {};
gethostname(hostname, 64);
IResult = getaddrinfo(hostname, "4500", &hints, &result);
if (IResult != 0) { //Smth bad happened get Error
printf("Error: Winsock2 addrinfo, %d", IResult);
WSACleanup();
return 2;
}
//Loop addresses
addrinfo* addr = result;
while (addr!=nullptr)
{
char ip[16];
inet_ntop(addr->ai_family, addr->ai_addr, ip, 16);
printf("Address found: %s", ip);
addr = addr->ai_next;
}
return 0;
}

我正在循环浏览addrinfo结构的链表,到目前为止,它只返回一个地址为 2.0.17.148 的结构,而我的机器的本地地址为 192.168.2.1

我只有 1 个网络接口,addrinfo返回一个有效的结构。

inet_ntop的参数应该是指向in_addr(IPv4(或in6_addr(IPv6(的指针。

您正在将其传递给sockaddr,这将是IPv4的sockaddr_in或IPv6的sockaddr_in6。(您不会获得任何 IPv6 地址,因为您只使用AF_INET请求 IPv4 地址(。sockaddr 包含家庭代码、端口和地址。

要获取in_addr,您需要在sockaddr_in结构中访问它:首先将addr->ai_addr转换为sockaddr_in*,然后访问sin_addr成员,然后获取指向它的指针。

inet_ntop(addr->ai_family, &((sockaddr_in*)addr->ai_addr)->sin_addr, ip, 16);

注意:这仅适用于 IPv4(AF_INET系列(。要同时支持IPv6,您需要检查该族是AF_INET还是AF_INET6,并使用sockaddr_in6进行AF_INET6,并为ip分配更多空间,因为地址更长。