簡體   English   中英

inet_ntoa問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM