[英]inet_ntoa problem
我在声明以下变量
unsigned long dstAddr;
unsigned long gateWay;
unsigned long mask;
这些变量包含网络字节顺序的ipaddress。 因此,当我尝试使用inet_ntoa函数的mask变量打印点表示法时,有时会打印出奇怪的值。 下面的代码在while循环中..循环了n次。
printf("%s\t%s\t%s\t",inet_ntoa(dstAddr),inet_ntoa(gateWay),inet_ntoa(mask));
192.168.122.0 0.0.0.0 0.255.255.255
但应该是
192.168.122.0 0.0.0.0 255.255.255.0
我打印了变量的十六进制值,它显示..
007aa8c0 00000000 ffffff00
那是因为inet_ntoa吗?
实际上,我正在尝试通过NETLINKS从内核中的254路由表中获取声明的变量的值。 我想我仍然应该使用inet_ntoa函数将值转换为点表示法。
唯一有意义的是,您对所有以网络字节顺序排列的地址的假设都是错误的。
好吧,鉴于它适用于您的非掩码值(包括第一个也设置了高位的值),我将查看mask
实际包含的内容。
以正常的无符号长打印出来是什么? 我敢打赌, mask
实际上不是正确的值:
printf ("%08x\t%08x\t%08x\n", dstAddr, gateWay, mask);
(假设您有四字节长)。
例如,这个小程序(在Cygwin下编译):
#include <stdio.h>
int main (void) {
unsigned long dstAddr, gateWay, mask;
dstAddr = 0x007aa8c0;
gateWay = 0x00000000;
mask = 0x00ffffff;
printf("%-15s %-15s %-15s\n",
inet_ntoa (dstAddr),
inet_ntoa (gateWay),
inet_ntoa (mask));
printf("%-15s ", inet_ntoa (dstAddr));
printf("%-15s ", inet_ntoa (gateWay));
printf("%-15s\n", inet_ntoa (mask));
printf ("%08x%8s%08x%8s%08x\n",
dstAddr, "",
gateWay, "",
mask);
return 0;
}
输出:
192.168.122.0 192.168.122.0 192.168.122.0
192.168.122.0 0.0.0.0 255.255.255.0
007aa8c0 00000000 00ffffff
请注意,由于它似乎使用静态缓冲区,因此必须分开对inet_ntoa
调用。 当我在单个printf
所有操作时,它在打印任何缓冲区之前都会覆盖该缓冲区的内容,因此,我只处理了最后一个缓冲区。 我不认为这种情况正在发生,因为您获得了不同的价值观。
我也跟你有同样的问题。 如果您需要其他方式,请使用inet_ntop()和inet_pton()。 不要使用inet_ntoa(),inet_aton()等类似的东西,因为它们已被弃用并且不支持ipv6。 请参阅链接: 将IP地址int转换为字符串
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.