2010-03-25 54 views
1

我聲明以下變量INET_NTOA問題

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 

我打印變量的十六進制值,它顯示了..

007aa8c0 00000000  ffffff00 

因此,這是因爲INET_NTOA的?

其實我試圖通過NETLINKS從內核的254路由表中獲取聲明變量的值。我想我應該仍然使用inet_ntoa函數將該值轉換爲點符號.. ??

+1

只是警告,inet_ntoa已棄用 - 您應該使用inet_ntop()或inet_pton()來代替。 – Salami 2010-03-25 06:52:49

+0

inet_ntop()和inet_pton()也不推薦使用,因爲它們不支持IPv6範圍標識符。如果您需要IPv6支持,您應該使用getaddrinfo()和getnameinfo()。 – 2010-03-25 08:00:48

+0

@codingfreak,無論是設置你的面具是錯誤的。根據我的答案,值應該是00ffffff。 – paxdiablo 2010-03-25 08:19:52

回答

5

唯一有意義的是,你對網絡字節順序中的所有地址的假設是不正確的。

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之內完成時,它在任何一個打印之前覆蓋了該緩衝區的內容,因此我只處理了最後一個。我不會認爲這是發生在你的情況,因爲你得到不同的價值觀。

+0

然後你的面具被設置不正確,因爲我猜測。它應該是00ffffff,* not * ffffff00。你需要找出設置的位置並修復它。這不是* inet_ntoa的問題。 – paxdiablo 2010-03-25 08:18:45

+0

我猜255.255.255.0的十六進制值是ffffff00?請使用以下工具進行檢查 - http://www.kloth.net/services/iplocate.php – codingfreak 2010-03-25 08:23:57

+0

您必須瞭解網絡和體系結構(小或大端)的字節順序。將192.168.122.0插入到相同的工具中,然後獲得C0A87A00,這也是錯誤的順序。在little-endian上,值0x01020304作爲04,03,02,01存儲在內存中。 – paxdiablo 2010-03-25 08:26:42

0

我也有同樣的問題與你。 使用inet_ntop()和inet_pton()如果您需要它,可以使用其他方法。不要使用inet_ntoa(),inet_aton()和類似的,因爲它們已被棄用,並且不支持ipv6。 請參閱鏈接:convert Ip address int to string