Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IPV6到国家/地区_C#_Geolocation_Ipv6 - Fatal编程技术网

C# IPV6到国家/地区

C# IPV6到国家/地区,c#,geolocation,ipv6,C#,Geolocation,Ipv6,IP版本6有一个简单的IP到国家数据库 此db的样本行值: "42540528726795050063891204319802818560", "42540528806023212578155541913346768895", "2001:200::", "2001:200:ffff:ffff:ffff:ffff:ffff:ffff", "JP", "Japan" 现在我想得到一个Ip地址的国家名称。这是我的SQL: SQL = "SELECT country_code FROM ip2lo

IP版本6有一个简单的IP到国家数据库

此db的样本行值:

"42540528726795050063891204319802818560", "42540528806023212578155541913346768895", "2001:200::", "2001:200:ffff:ffff:ffff:ffff:ffff:ffff", "JP", "Japan"
现在我想得到一个Ip地址的国家名称。这是我的SQL:

SQL = "SELECT country_code FROM ip2location_ipv6 WHERE " & IPNumber & " BETWEEN ip_from AND ip_to"
在此sql中有一个名为IPNumber的参数。在IPV4中,我可以轻松计算IPNumber

IPV4: a.b.c.d  => IPNumber = a*(256*256*256) + b*(256*256) + C*(256) + d
或者我能做到

IPNumber = (long)(uint)IPAddress.NetworkToHostOrder((int)IPAddress.Parse("IP_address_Version_4").Address);

但我没有C语言中的IPV6解决方案。例如,它希望在此数据库中查找此IP的国家名称2001:DB8::dcaf:BAD要从二进制转换为标准IPV6表示法:

将IPAddress类与一起使用

在构造函数中传入IPv6地址的字节数组,然后使用.ToString方法创建

要将标准IPv6表示法转换为二进制,请执行以下操作:


创建新的IPAddress对象,并使用将标准符号字符串转换为二进制值。

您可以使用最新版本的mysql 5.6。它已经支持IPv6和命令INET6\u ATON、INET6\u NTOA

你的桌子会很好-

CREATE TABLE `ip2location_ipv6`(
    `ip_from` int(11) unsigned,
    `ip_to` int(11) unsigned,
    `ipv6_from` varbinary(16),
    `ipv6_to` varbinary(16),
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    INDEX `idx_ip_from` (`ip_from`),
    INDEX `idx_ip_to` (`ip_to`),
    INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

数据库中的ip_from和ip_to列是双精度的。IPAddress.TryParsestring标准符号将ip转换为二进制。我想在此查询中使用此值,从ip2location_ipv6中选择country_code,其中&IPNumber&介于ip_FROM和ip_Tos之间,以便从double中获取字节并将其传入。无论如何,它们不能是double,因为double只有64位,IPv6地址是128。好的一点是,double只有15个有效数字。这个数据库非常糟糕。我没有检查更改历史记录,但到今天为止,DB行包含IPv4值的DOUBLE和IPv6值的VARCHAR40。下面是C.NET4.0将IPv6地址字符串转换为BigInteger的示例代码。您没有指明数据库的品牌。一些数据库管理系统,如PostgreSQL,多年来一直具有本机IP地址v4和v6。
CREATE TABLE `ip2location_ipv6`(
    `ip_from` int(11) unsigned,
    `ip_to` int(11) unsigned,
    `ipv6_from` varbinary(16),
    `ipv6_to` varbinary(16),
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    INDEX `idx_ip_from` (`ip_from`),
    INDEX `idx_ip_to` (`ip_to`),
    INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;