我有一个关于使用联合库winsock.h将数字转换为ipv4地址的问题如何写?
#ifdef obsolete
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
这是一种方法:
S_un addr;
addr.S_addr = htonl( 2655715960 );
printf("%hhu.%hhu.%hhu.%hhu %hhX:%hhX:%hhX:%hhX \n",
addr.S_un_b.s_b1, addr.S_un_b.s_b2, addr.S_un_b.s_b3, addr.S_un_b.s_b4,
addr.S_un_b.s_b1, addr.S_un_b.s_b2, addr.S_un_b.s_b3, addr.S_un_b.s_b4 );
幻数2655715960
是您评论中的示例输入值。代码将打印想要的行:
158.75.2.120 9E:4B:2:78
注意:使用十六进制打印 IPv4 地址并不常见。
注 2:使用struct in_addr
代替S_un
. 因此,您可以使用inet_ntoa
将 IP 号转换为字符串的函数。
使用我的魔法玻璃球,我试图猜测这里问的是什么:
sockaddr_storage可以使用 IPv4 和 IPv6 地址。
ss_family
表示里面存放的是什么。
根据它的设置,它是sockaddr_in
(对于 IPv4)或sockaddr_in6
(对于 IPv6)(http://msdn.microsoft.com/en-us/library/windows/desktop/ms740496(v=vs.85).aspx)。