将sockaddr中的IP地址转换为uint32_t

时间:2015-09-29 13:36:16

标签: c++ linux sockets network-programming

我想将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?或其他因为字节顺序?

2 个答案:

答案 0 :(得分:7)

它会起作用,是的。

根据the documentationstruct in_addr的定义如下:

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

所以是的,你可以将它分配给uint32_t(你甚至不需要把它投射出来)。

“网络字节顺序”位确实也告诉我们,如果你在一个不是大端的机器上运行它,你最终会得到垃圾。您希望通过ntohl()传递它以解决此问题。

答案 1 :(得分:2)

只要您不尝试打印clientIpAddr,只需在调用sendtobind时重复使用,此转换就可以正常使用。

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

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