c - 如何将 u_int32_t IPv4 地址分配给 C 中 sockaddr_in 的地址参数?(C 中的套接字编程)
问题描述
我设法将广播地址作为 u_int32_t 获取,我的目标是将广播地址分配给 saddr.sin_addr.s_addr 参数,这样我就可以使用 inet_ntoa() 将其转换为字符串:
struct sockaddr_in *broadcastInfo;
char *broadcastAddress;
// the ip and mask are both initialized as u_int32_t earlier in the code
u_int32_t broadcast = (ip | (~mask)); // broadcast address = ip OR `netmask
// the broadcast address now equals c0a807ff or 192.168.7.255
broadcastInfo->sin_addr.s_addr = htonl(broadcast);
broadcastAddress = inet_ntoa(broadcastInfo->sin_addr);
printf("Broadcast Address: %s\n", broadcastAddress);
根据 arpa/inet.h 文档, htonl() 将 u_int32_t 作为参数,因此该部分应该可以工作。我在 C 中查看的一些关于套接字编程的非官方文档暗示我可以将 htonl() 的输出分配给 broadcastInfo->sin_addr.s_addr,但是当我尝试这样做时,我得到了Segmentation fault: 11作为输出。我在这里想念什么?抱歉,如果这是一个明显的解决方法,但我已经坚持了一段时间。提前致谢 :)
编辑
此外,根据 Beej 的网络编程指南, sin_addr 结构应该是:
struct in_addr {
uint32_t s_addr; // that's a 32-bit int (4 bytes)
};
那么为什么不将 32 位 int 分配给 s_addr 工作呢?
解决方案
请考虑@David C. Rankin 评论以获得关于网络编程的良好指南,认为您的问题与网络无关。
我去删除了您的几行代码以使其更加明显:
struct sockaddr_in *broadcastInfo;
broadcastInfo->sin_addr.s_addr = htonl(broadcast);
所以,发生的事情是您正在使用广播信息,它是一个指针,没有给它一个实际值,所以指针很有可能指向一个无效的地址,因此就是 SEGFAULT。
考虑到您的用例,您可能只是想要一个按值而不是按指针的结构:
struct sockaddr_in broadcasrInfo = {};
/* The rest of your code here. */
broadcastInfo.sin_addr.s_addr - htonl(broadcast);
当然,在那里,将您使用广播信息的地方更改为 &broadcastInfo。
祝你有美好的一天,
推荐阅读
- c - 将 nano_usb_programmer 与 Sensinode 一起使用
- date - 如何修复不一致的数据类型:预计 NUMBER 在 Oracle 中得到 DATE
- c# - Azure API 管理 - 通过客户端证书保护 API
- javascript - 从 jquery 创建一个输入类型文件
- coq - 规范语言与编程语言
- android - Genymotion 如何模拟非 Google 设备?
- python - 更新 matplotlib.axes.Axes.imshow() 绘制的图形
- azure - 文件转换任务无法转换压缩包上的 XML 配置
- sql - DbContext.DbSet.FromSql() 不接受参数
- javascript - reactjs如何获取元素属性