将sockaddr中的IP地址转换为uint32_t
Convert IP address in sockaddr to uint32_t
我正在尝试将存储在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,并且只是在调用sendto
或bind
时重用它,此转换将正常工作。
要正确转换地址,您需要使用ntohl
函数,它将从网络转换为主机字节顺序,否则您的0.0.0.1地址将在clientIpAddr中具有值0x1000000:
uint32_t clientIpAddr = ntohl(addr->sin_addr.s_addr);
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- C++:从 "const variable*" 转换为"uint32"会失去精度
- 从指针到 uint32 的类型转换
- 将字符 * 转换为 uint16 和 uint32
- 警告缩小转换范围(uint32 到 uint8)
- 将 UINT32 颜色格式从 AaBbGgRr 转换为 AaRrGgBb
- 隐式转换:uint32到int
- 如何在c++中将UINT8转换为UINT32 ?
- 将UINT32值转换为UINT8数组[4]
- 当数字声明为uint32和uint64时,将整数转换为二进制会显示不同的输出
- 将 uint32 转换为常量字符* C++
- 将float转换为uint64和uint32的行为很奇怪