如何在 C 中将 u_int32_t IPv4 地址分配给 sockaddr_in 的地址参数? (C 套接字编程)
How do I assign an u_int32_t IPv4 address to the address parameter of sockaddr_in in C? (Socket Programming 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 作为参数,因此该部分应该可以工作。一些 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 位整数分配给 s_addr 工作呢?
请考虑@David C. Rankin 的评论以获得有关网络编程的良好指南,认为您的问题与网络无关。
我删除了你的几行代码以使其更明显:
struct sockaddr_in *broadcastInfo;
broadcastInfo->sin_addr.s_addr = htonl(broadcast);
所以,发生的事情是您正在使用 broadcastInfo,它是一个指针,但从未给它一个实际值,所以指针很有可能指向无效地址,因此是 SEGFAULT。
考虑到您的用例,您可能只是想通过值而不是指针来获得结构:
struct sockaddr_in broadcasrInfo = {};
/* The rest of your code here. */
broadcastInfo.sin_addr.s_addr - htonl(broadcast);
然后,当然,将您使用 broadcastInfo 的地方更改为 &broadcastInfo。
祝你有美好的一天,
我已经设法将广播地址设为 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 位整数分配给 s_addr 工作呢?
请考虑@David C. Rankin 的评论以获得有关网络编程的良好指南,认为您的问题与网络无关。
我删除了你的几行代码以使其更明显:
struct sockaddr_in *broadcastInfo;
broadcastInfo->sin_addr.s_addr = htonl(broadcast);
所以,发生的事情是您正在使用 broadcastInfo,它是一个指针,但从未给它一个实际值,所以指针很有可能指向无效地址,因此是 SEGFAULT。
考虑到您的用例,您可能只是想通过值而不是指针来获得结构:
struct sockaddr_in broadcasrInfo = {};
/* The rest of your code here. */
broadcastInfo.sin_addr.s_addr - htonl(broadcast);
然后,当然,将您使用 broadcastInfo 的地方更改为 &broadcastInfo。
祝你有美好的一天,