gpt4 book ai didi

c++ - inet_ntop 返回不存在的地址

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:02 26 4
gpt4 key购买 nike

#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 个网络接口(interface),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,需要检查family是AF_INET还是AF_INET6,AF_INET6使用sockaddr_in6ip分配更多空间,因为地址更长。

关于c++ - inet_ntop 返回不存在的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59581083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com