将sockaddr中的IP地址转换为uint32_t

Convert IP address in sockaddr to uint32_t

本文关键字:uint32 转换 地址 sockaddr 中的 IP      更新时间:2023-10-16

我正在尝试将存储在struct sockaddr中的IP地址(v4)转换为uint32_t

//struct sockaddr in_addr;
struct sockaddr_in* addr = (struct sockaddr_in*)&in_addr;
uint32_t clientIpAddr = static_cast<uint32_t>(addr->sin_addr.s_addr);
uint16_t clientPortNumber = addr->sin_port;

首先,我想知道这是否有效。

第二,是否先将IP地址转换为char[4],再转换为uint32_t比较好?

第三,IP地址0.0.0.1会转换为1吗?还是因为字节顺序的关系?

会成功的。

根据文档,struct in_addr定义如下:

struct in_addr {
    uint32_t s_addr; /* address in network byte order */
};

所以是的,你可以将它分配给uint32_t(你甚至不需要强制转换它)。

"in network byte order"位确实也告诉我们,如果你在一台不是大端序的机器上运行它,你将以垃圾结束。你想通过ntohl()来解决这个问题

只要您不尝试打印clientIpAddr,并且只是在调用sendtobind时重用它,此转换将正常工作。

要正确转换地址,您需要使用ntohl函数,它将从网络转换为主机字节顺序,否则您的0.0.0.1地址将在clientIpAddr中具有值0x1000000:

uint32_t clientIpAddr = ntohl(addr->sin_addr.s_addr);