- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 inet_pton()
函数感到困惑。根据man page
This function converts the character string src into a network address structure in the af address family, then copies the network address structure to dst. The af argument must be either AF_INET or AF_INET6. dst is written in network byte order.
因此该函数产生一个网络字节顺序值。但是我得到了这段代码:
struct sockaddr_in a;
char sip[20];
inet_pton(AF_INET, "192.168.0.182", (void *)&a.sin_addr);
inet_ntop(AF_INET, (void *)&a.sin_addr, sip, 20);
printf("htonl:%08x\n", htonl(a.sin_addr.s_addr));
printf("inet_pton:%08x\n", a.sin_addr.s_addr);
printf("inet_ntop:%s\n", sip);
输出:
htonl:c0a800b6
inet_pton:b600a8c0
inet_ntop:192.168.0.182
inet_pton
的输出是b6.00.a8.c0
,转换为182.0.168.192
,也不同于htonl
的输出。
因为 htonl
将主机字节顺序转换为网络字节顺序,所以如果 inet_pton
生成网络字节顺序,我想它们的输出应该是相同的?这是否意味着 inet_pton
实际上会生成主机字节顺序?
如果 inet_pton
已经生成了 network byte order
,为什么我需要 htonl
来获得正确的值?
最佳答案
是的,inet_pton
按网络顺序将地址字节放入目标缓冲区。让我们通过一个例子来看看会发生什么。使用您的地址“192.168.0.182”,inet_pton
产生这四个字节:
c0 a8 00 b6 (hex)
192 168 0 182 (dec)
是网络字节顺序。当您随后调用 htonl
(这实际上是不正确的——您应该调用 ntohl
将 从 网络顺序转换为主机顺序,但正如@ZanLynx 指出的那样,这两个函数在 x86 上是相同的),您重新排序字节到:
b6 00 a8 c0
但随后您将该表单传递给 printf
与 %x
作为格式。这告诉 printf
将四个字节解释为单个 32 位整数,但 x86 是小端机器,因此当它将四个字节作为整数加载时,b6
是最低位字节,c0
是最高的,产生你所看到的:
htonl:c0a800b6
所以,一般来说,如果你有一个网络形式的 IPv4 地址,并且你想以对你(作为程序员)“有意义”的顺序快速显示它(用于调试或其他),你将使用:
printf("%x\n", ntohl(a.sin_addr.s_addr));
您还可以按照网络顺序显示单个字节(这实际上是完全相同的事情,但可能更容易理解),只需使用 unsigned char *
(或等效于 uint8_t *
来自 <stdint.h>
)打印单个字节:
uint8_t *ipp = (void *)&a.sin_addr.s_addr;
printf("%02x %02x %02x %02x\n", ipp[0], ipp[1], ipp[2], ipp[3]);
(您需要在此处使用无符号类型以避免符号扩展。在上面的语句中,每个字符都将在对 int
的调用中提升为 printf
。如果您有一个带符号的 char
包含,例如,0xc0,它通常会被符号扩展为 32 位 int
:0xffffffc0。作为替代方案,您可以使用格式规范 "%02hhx"
,它明确告诉 printf
您确实传递了一个 char
;然后它只会查看每个提升的 int
的最低位字节。)
关于C - inet_pton() 不生成网络字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53646246/
我的目标是成功调用 C 中的函数 inet_pton。我使用的是 Windows 7。到目前为止,我了解到 inet_pton 有 3 个参数。此外,它的工作是将人类的 IP 表示转换为计算机的二进制
我对 inet_pton() 函数感到困惑。根据man page This function converts the character string src into a network addr
我正在尝试使用 PHP 代码中的 inet_pton() 将 IP 地址转换为用于 mysql 存储的数字字符串,但此函数要么不返回任何内容,要么返回以下内容:'�?i'注意:IP 地址是标准的 IP
inet_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”和“二进制整数”之间转换,而且inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。算是比较新的函数了
我有两个与我的实现相关的问题 - 我需要一个可以将给定链路层地址从文本格式转换为标准格式的函数,就像我们在 n/w 层对 IP 地址有一个类似的函数 inet_pton() 可以转换从文本到标准 IP
我试图在我的程序中包含以下代码,但会出现错误('inet_pton': identifier not found)。 // IPv4: struct sockaddr_in ip4addr; int
在我的程序中,我使用 inet_pton 函数的两种方式之一: 第一个:如果参数中没有指定默认 IP。 inet_pton(AF_INET, defaultIP, &servaddr.sin_addr
我想在 Cython 中调用 inet_pton 获取 IPv6 地址。基本上,我想执行与以下 C 代码等效的操作: char str[16]; inet_pton(AF_INET6, "12:212
我正在尝试将 IPv6 地址保存在 MySQL 数据库中。我正在使用 inet_pton 来执行此操作。但是,我注意到一些 IP(特别是这个本地主机 IP)正在返回空字符串。示例: $ip = ine
我正在尝试将 IPv6 兼容性添加到 C 中已经兼容 IPv4 的程序中,但编译器存在一些问题。目前使用 mingw32-gcc-4.6.2 编译,这在使用函数 inet_pton 时出现链接错误。
我在数据库中有一个名为 ip 的唯一列 IP 地址在使用 PHP 函数转换后以 BINARY(16)(无排序规则)形式存储在此列中 $store_ip = inet_pton($ip); 当我尝试插入
IP 地址使用 PHP 脚本中的 inet_pton() 进行存储。它们存储在数据库的 varbinary(16) 字段中。然而,我现在需要查询并返回仅使用 MySQL 存储的 IP 地址,但这似乎有
我正在尝试通过正在监听 127.0.0.1:9050 的 TOR 发出 GET 请求 我已经安装了请求 socks :pip install -U requests[socks] import re
当尝试将 Facebook 的数字 IP 地址解析为测试 2620:0:1cfe:face:b00c::3: 时,如果我将终止符 0 留在地址,inet_pton() barfs。如果我把它放回去,一
我正在尝试将 IPv4 地址从 std::string 转换为它在 C++ (Windows) 中的 unsigned int 表示(根据 this ) 我设法用下面的代码做到了这一点: void s
当我对 FE80:0000:0000:0000:0202:B3FF:FE1E:8329 使用 inet_pton() 时,我得到 ������ ) 不管那是什么。 然后我添加了 bin2hex() 并
在 C 中,函数 inet_pton() 是仅将 ip 地址从 printble 格式转换为字符串格式,还是也转换 ip 地址和端口号?我的意思是,如果我有一个格式为 A.B.C.D:E 的字符串,其
我正在寻找使用套接字对 ip 地址执行掩码操作的正确方法。我尝试使用 inet_pton 将 ip 地址转换为二进制,然后执行二进制和 (&),但编译器提示我无法将 sin_addr 转换为 unsi
我目前正在研究 IPv6 类并使用 inet_pton 从字符串中检索 IP 的实际二进制表示,即: AdressV6::AdressV6(const String & _ip) {
inet_pton 和 AF_INET 应该提供一个 in_addr,其成员 s_addr 将具有与uint32_t 类型。我正在尝试使用此属性来检查给定 IP 是否属于某个范围,如下所示: #inc
我是一名优秀的程序员,十分优秀!