Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 这是一个问题_C_Sockets - Fatal编程技术网

C 这是一个问题

C 这是一个问题,c,sockets,C,Sockets,我声明以下变量 unsigned long dstAddr; unsigned long gateWay; unsigned long mask; 这些变量包含按网络字节顺序排列的IP地址。因此,当我试图使用inet_ntoa函数为掩码变量打印点符号时,有时它会打印奇怪的值。下面的代码位于while循环中。。循环n次 printf("%s\t%s\t%s\t",inet_ntoa(dstAddr),inet_ntoa(gateWay),inet_ntoa(mask)); 19

我声明以下变量

unsigned long   dstAddr;
unsigned long   gateWay;
unsigned long   mask;
这些变量包含按网络字节顺序排列的IP地址。因此,当我试图使用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
我打印了变量的十六进制值,它显示

007aa8c0    00000000      ffffff00  
那么这是因为内塔吗


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

唯一有意义的是,您关于所有地址都以网络字节顺序排列的假设是不正确的。

好吧,考虑到它适用于您的非掩码值(包括第一个也有高位设置的值),我想看看
掩码
实际包含的内容

当您将其打印为正常的无符号长字符时是什么?我打赌
mask
实际上不是正确的值:

printf ("%08x\t%08x\t%08x\n", dstAddr, gateWay, mask);
(假设有四个字节长)

例如,这个小程序(在Cygwin下编译):


请注意,我必须分离对
inet\u ntoa
的调用,因为它似乎使用了静态缓冲区。当我在一个
printf
中完成所有操作时,它会在打印任何内容之前重写该缓冲区的内容,因此我只处理最后一个内容。我不认为你的情况会发生这种情况,因为你得到了不同的价值观。

我也有同样的问题。 如果需要,请使用inet\u ntop()和inet\u pton()。不要使用inet_ntoa()、inet_aton()和类似的工具,因为它们已被弃用,并且不支持ipv6。
请参阅链接:

只是一个警告,inet\u ntoa已被弃用-您应该改用inet\u ntop()或inet\u pton()。inet\u ntop()和inet\u pton()也被弃用,因为它们不支持IPv6作用域标识符。如果您想获得IPv6支持,应该使用getaddrinfo()和getnameinfo()。@codingfreak,设置掩码的任何内容都是错误的。根据我的回答,这个值应该是00ffffff。那么你的掩码设置不正确,正如我猜测的那样。它应该是00ffffff,而不是ffffff00。你需要找出设置的位置并修复它。这不是inet_ntoa的问题。我猜255.255.255.0的十六进制值是ffffff00??使用以下工具进行检查-您必须了解网络和体系结构的字节顺序(小端或大端)。将192.168.122.0插入同一工具,您将得到C0A87A00,这也是错误的顺序。在little endian上,值0x01020304以04,03,02,01的形式存储在内存中。有一点值得怀疑,我实际上是通过netlink套接字从内核获取这些值的。。“所以还是有大的和小的endian出现在画面上??现在你们已经超越了我的专业领域,”codingfreak说。我只能说,从经验证据来看,面具是错误的。我以前从未使用过netlinks接口。
#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