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