c++ - 将 sockaddr 中的 IP 地址转换为 uint32_t

标签 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吗?还是因为字节顺序的原因?

最佳答案

它会起作用,是的。

根据 the documentation , struct in_addr 定义如下:

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

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

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

关于c++ - 将 sockaddr 中的 IP 地址转换为 uint32_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32845445/

相关文章:

c++ - OpenCV3.10 core.hpp必须用C++编译

c++ - 查询Boost.Icl Interval_set重叠间隔

c++ - 带有无符号整数的奇怪 gcc 行为

linux - 如何将文件的传入内容流式传输到远程服务器?

android - "Permission denied"连接到页面时,即使具有 INTERNET 权限

c++ - 我的汇编代码有什么问题

c - 多客户端 UDP 聊天

linux - oracle 瘦 jdbc 连接在不活动后接收 "connection reset"

ruby - Socket.recv 有效但无法获取或读取?

linux - 创建后将 POSIX 套接字的类型从 UDP 更改为 TCP