inet_ntoa问题

时间:2010-03-25 06:46:10

标签: c sockets

我宣布以下变量

unsigned long   dstAddr;
unsigned long   gateWay;
unsigned long   mask;

这些变量包含网络字节顺序的ipaddresses。因此,当我尝试使用inet_ntoa函数为掩码变量打印点符号时,它有时会打印奇怪的值。下面的代码在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

我打印了变量的HEX值,它显示了..

007aa8c0    00000000      ffffff00  

这是因为inet_ntoa ??

实际上我试图通过NETLINKS从内核中的254路由表中获取声明变量的值。我想我仍然应该使用inet_ntoa函数将值转换为点表示法。??

3 个答案:

答案 0 :(得分:5)

唯一有意义的是,您对网络字节顺序中所有地址的假设是不正确的。

答案 1 :(得分:3)

好吧,鉴于它适用于你的非掩码值(包括第一个也设置了高位的值),我会看看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内完成所有操作时,它会在打印任何缓冲区之前覆盖该缓冲区的内容,因此我只处理了最后一个缓冲区。我不会认为在您的案例中发生了这种情况,因为您获得了不同的价值。

答案 2 :(得分:0)

我也有同样的问题。 如果您需要其他方法,请使用inet_ntop()和inet_pton()。不要使用inet_ntoa(),inet_aton()和类似的,因为它们已被弃用并且不支持ipv6。 请参阅链接:convert Ip address int to string