[英]How to compare an IPv6 is greater/less than in C
使用inet_pton
轉換IPv4以比較它是否在IPv4范圍內是非常簡單的。 但是,我不確定如何使用inet_pton
和in6_addr
查看它是否小於/大於另一個IP。 這就是我的想法:
#include <arpa/inet.h>
...
const char *ip6str = "0:0:0:0:0:ffff:c0a8:3";
const char *first = "0:0:0:0:0:ffff:c0a8:1";
const char *last = "0:0:0:0:0:ffff:c0a8:5";
struct in6_addr result, resfirst, restlast;
uint8_t ipv6[16]; // perhaps to hold the result?
inet_pton(AF_INET6, first, &resfirst);
inet_pton(AF_INET6, last, &reslast);
inet_pton(AF_INET6, ip6str, &result);
//assuming inet_pton succeed
if(result.s6_addr >= resfirst.s6_addr && result.s6_addr <= reslast.s6_addr)
//within range
您可以使用memcmp
來實現,因為它們以網絡字節順序(又名big endian)存儲。
if (memcmp(&result, &resfirst, sizeof(result)) > 0 && memcmp(&result, &reslast, sizeof(result)) < 0)
我想您可能是指>=
,也可能是<=
。
實際上,至少在小端機器上,您也必須對IPv4這樣做。
is_in_network_v6()
基於出色的文檔http://grothoff.org/christian/rmv608.pdf 。
#include <arpa/inet.h>
#include <stdio.h>
int is_in_network_v6(const struct in6_addr *network,
const struct in6_addr *mask,
const struct in6_addr *ip)
{
unsigned int i;
for (i = 0; i < sizeof(struct in6_addr) / sizeof(int); i++) {
if ( ((((int *) ip )[i] & ((int *) mask)[i])) != (((int *) network)[i]
& ((int *) mask)[i]))
return 0;
}
return 1;
}
int main(int argc, char *argv[])
{
char *ipStr = "2001:db8:8714:3a90::12";
char *netmaskStr = "ffff:ffff:ffff:ffff::";
char *networkStr = "2001:db8:8714:3a90::";
struct sockaddr_in6 ip, netmask, network;
inet_pton(AF_INET6, ipStr, &(ip.sin6_addr));
inet_pton(AF_INET6, netmaskStr, &(netmask.sin6_addr));
inet_pton(AF_INET6, networkStr, &(network.sin6_addr));
printf("ip: '%s', netmask: '%s', network: '%s': %d\n",
ipStr, netmaskStr, networkStr,
is_in_network_v6(&(network.sin6_addr), &(netmask.sin6_addr),
&(ip.sin6_addr)));
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.