ip位址比較
在比較ip位址之前需要將其轉換為網路位元組序的二進位制整數,常用的ip位址轉換函式是 inet_pton(),其支援ipv4和ipv6.
windows下:
#include linux下:
#include int inet_pton(int af, const char *src, void *dst);
#include int main()
大端模式 - 資料的高位元組儲存在記憶體的低位址中
小端模式 - 資料的高位元組儲存在記憶體的高位址中
模式第一位元組
第二位元組
第三位元組
第四位元組
大端192
16821小端
12168192
所以將需要比較的位址轉換為網路位元組序(大端模式)後,使用函式memcmp()就可以按位元組比較兩個位址大小。
int memcmp(const void *buf1, const void *buf2, unsigned int count);
#include #include #include #include #include // 簡單判斷是否為ipv6
bool isipv6(const char* ipstr)
// ip位址比較,要求兩個ip位址同一型別,格式符合標準
int ipcmp(const char* ipstr1, const char *ipstr2)
; char buf2[sizeof(struct in6_addr)] = ;
int domain = isipv6(ipstr1) ? af_inet6 : af_inet;
int length = domain==af_inet ? sizeof(struct in_addr) : sizeof(struct in6_addr);
int s1 = inet_pton(domain, ipstr1, buf1);
int s2 = inet_pton(domain, ipstr2, buf2);
assert(s1>0 && s2>0); // 斷言 兩個ip格式符合標準
return memcmp(buf1, buf2, length);
}int main(int argc, char **ar**)
int result = ipcmp(ar**[1], ar**[2]);
if (result > 0)
printf("%s is greater than %s\n", ar**[1], ar**[2]);
else if (result < 0)
printf("%s is less than %s\n", ar**[1], ar**[2]);
else
printf("%s is equal to %s\n", ar**[1], ar**[2]);
exit(exit_success);
}
ipv4v6雙棧技術 IPv4 IPv6雙棧方法
室 010 3337 3338 8030 傳真 82893336 8031 ipv4 ipv6 雙棧方法 正如問題的幽靈所表現出來的,傳統系統的堅固性被高估了。很長時間內,ipv4 仍將存在,即使一些網路或連網世界的其餘部分已公升級為 ipv6 到那時,公升級系統將需要保持與 ipv4 系統的互操作...
IPv6為啥無法相容IPv4
隨著 ietf 的大牛公開承認 ipv6 設計中的最大敗筆是沒有做到和 ipv4 的向下相容 國內一些所謂的先知先覺者又跳了出來,這一說法成為推銷自己產品和 理念 的又一手段甚至工具,提出了一些所謂的能夠和 ipv4 相容的 超越了 ietf 的ipv6 的下一代網際網路技術!相容包括向下相容和向上...
IPV4和IPV6詳細對比
我們已經在ip接力中介紹過,乙個ip包分為頭部 header 和資料 payload data 兩部分。頭部是為了實現ip通訊必須的附加資訊,資料是ip通訊所要傳送的資訊。黃色區域 同名區域 我們看到,三個黃色區域跨越了ipv4和ipv6。version 4位 用來表明ip協議版本,是ipv4還是i...