将IP地址从sockaddr转换为in_addr

维科

我需要将放置在structure中的套接字地址转换sockaddr为structure in_addr我试图了解IP如何存储在这些结构中:

struct sockaddr {
        u_short sa_family;              /* address family */
        char    sa_data[14];            /* up to 14 bytes of direct address */
};


struct in_addr {
        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;

我陷入了疑问,如何127.0.0.1存储为14个字符sa_data将sockaddr转换为in_addr的最佳方法是什么?

无辜的旁观者

sockaddr是通用结构,由不同类型的套接字共享。对于TCP / IP套接字,此结构变为sockaddr_in(IPv4)或sockaddr_in6(IPv6)。对于unix套接字,它变为sockaddr_un

理想情况下,您将使用sockaddr_in代替sockaddr

但是给定sockaddr,要从中提取IP地址,您可以这样做:

sockaddr foo;
in_addr ip_address = ((sockaddr_in)foo).sin_addr;
or
in_addr_t ip_address = ((sockaddr_in)foo).sin_addr.s_addr;

如果您向里看,sockaddr_in您将看到的前2个字节sa_data是端口号。接下来的4个字节是IP地址。

PS:请注意,IP地址是以网络字节顺序存储的,因此您可能需要使用ntohl(网络到主机)和htonl(主机到网络)转换成主机字节顺序或从主机字节顺序转换。

更新

对于IPv6,情况类似:

sockaddr foo;
in_addr6 ip_address = ((sockaddr_in6)foo).sin6_addr;

访问单个字节,使用ip_address[0]... ip_address[15]

sockaddr_in6结构内部,sa_data端口的前2个字节是端口号,后4个字节是流信息,其后的16个字节是IPv6地址。

警示[,然而,sockaddr_in6更大的sockaddr,所以从铸造时sockaddrsockaddr_in6,确保该地址的确是通过检查地址族IPv6地址foo.sa_family == AF_INET6

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将IP范围转换为IP地址

来自分类Dev

将整数值转换为ip地址

来自分类Dev

Powershell将IP地址转换为整数

来自分类Dev

将整数值转换为ip地址

来自分类Dev

将IP地址转换为位[]

来自分类Dev

为什么必须在此代码中强制转换为 struct in_addr ?

来自分类Dev

将 IP 范围转换为单个 IP 地址 BASH

来自分类Dev

Bash脚本将IP地址批量转换为CIDR?

来自分类Dev

将IP地址转换为有效的URI

来自分类Dev

如何将IP地址转换为国家名称

来自分类Dev

将IP地址转换为二进制

来自分类Dev

Bash命令将IP地址转换为它们的“反向”形式?

来自分类Dev

将IP地址转换为十六进制

来自分类Dev

将数字转换为IP地址(v4)

来自分类Dev

如何将字符串转换为IP地址?

来自分类Dev

将 IP 地址字符串转换为 int

来自分类Dev

如何将变量值addr [] net.IP转换为字符串?

来自分类Dev

将IP地址转换为IP范围(起始IP-终止IP)

来自分类Dev

如何将IP转换为地址,然后按城市分组这些地址?

来自分类Dev

将 Mac 地址和 IP 地址转换为特定大小的字节数组

来自分类Dev

将地址转换为国家

来自分类Dev

Snowflake可以将整数标记的IP转换为字符串IP地址吗?

来自分类Dev

为什么在调用bind()时将sockaddr_in转换为sockaddr?

来自分类Dev

C-强制转换“ h_addr_list”数组以键入“ struct in_addr **”

来自分类Dev

如何将任何IP地址转换为斜杠24前缀

来自分类Dev

如何将re.findall()响应中的IP地址数组转换为字符串

来自分类Dev

将IP或MAC地址从字符串转换为字节数组(Arduino或C)

来自分类Dev

将IP地址(IPv4)转换为R中的整数

来自分类Dev

将十六进制值转换为C中字符串类型的ip地址。

Related 相关文章

热门标签

归档