gpt4 book ai didi

c - 从 struct addrinfo 中提取十六进制 IP

转载 作者:太空宇宙 更新时间:2023-11-04 07:17:04 24 4
gpt4 key购买 nike

我已经用数据填充了我的结构struct addrinfo **res:

err = getaddrinfo(argv[1], NULL, &hints, &res);

如果我想打印IP地址,我可以使用

addr.s_addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr;
printf("ip address : %s\n", inet_ntoa(addr));

这将打印例如 10.111.1.11。但我需要十六进制格式的 IP,即 0A6F010B。我想出了以下方法,它确实会以十六进制格式打印 IP:

for (i=0; i<32; i=i+8)
printf("%02X",(addr.s_addr>>i) % 256) ;

但在我看来,我的方法过于复杂了。我需要两个步骤(两次转换)。我想尽可能简化我的代码,并直接从 res->ai_addr->sa_data 打印十六进制 IP(无需将数据存储在 addr.s_addr首先)。

我知道数据在 res->ai_addr->sa_data 中。我可以打印它:

for (i=0; i<14; i++)
printf("%d", res->ai_addr->sa_data[i]);
printf("\n");

我得到以下输出(对应于 10.111.1.11):

001011111100000000

但格式并不像前面的示例那样简单。例如对于 172.25.0.31 我得到这个输出:

00-842503100000000

因此我的问题:

如何将这些乱码转换为十六进制 IP 地址?

最佳答案

根据linked questionthis description of sockaddr ,你需要做一些动态类型的修改。使用正确的类型,它可能看起来像这样:

struct addrinfo * res;
err = getaddrinfo(argv[1], NULL, &hints, &res);

// check that the operation succeeded
assert(err == 0);

// check that the dynamic type is AF_INET
assert(res->ai_addr->sa_family == AF_INET);

// downcast
struct sockaddr_in * p = (struct sockaddr_in *)(res->ai_addr);

// done
printf("Address: %08X (%s)\n", p->sin_addr.s_addr, inet_ntoa(p->sin_addr));

执行适当的动态类型选择的更完整示例可能如下所示:

char str[128];

switch (res->ai_addr->sa_family)
{
case AF_INET:
{
struct sockaddr_in * p = (struct sockaddr_in *)(res->ai_addr);
if (inet_ntop(p->sin_family, &p->sin_addr, str, sizeof str) == NULL)
fprintf(stderr, "Error in inet_ntop: %s\n", strerror(errno));
else
printf("Address: %08X (%s)\n", p->sin_addr.s_addr, str);
break;
}
case AF_INET6:
{
struct sockaddr_in6 * p = (struct sockaddr_in6 *)(res->ai_addr);
if (inet_ntop(p->sin6_family, &p->sin6_addr, str, sizeof str) == NULL)
fprintf(stderr, "Error in inet_ntop: %s\n", strerror(errno));
else
printf("Address: %s\n", str);
break;
}
default:
{
fprintf(stderr, "Unrecogized address family, skipping.\n");
}
}

关于c - 从 struct addrinfo 中提取十六进制 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23721763/

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