【发布时间】:2020-12-28 02:01:10
【问题描述】:
我已经设法将广播地址作为 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 作为参数,因此该部分应该可以工作。一些unofficial documentation 我查看了 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 工作呢?
【问题讨论】:
-
对于一个优秀的最新(尽管写得比较通俗)的网络教程,Beej's Guide to Network Programming 将助您一臂之力。
标签: c sockets unix-socket