【问题标题】:ip4 and ip6 convert in different wayip4 和 ip6 以不同的方式转换
【发布时间】:2013-11-16 00:26:39
【问题描述】:

我想将 IP 范围存储到数据库中。问题是一些IP是ipv4和一些ipv6。我想将所有转换为 ipv6 然后存储到数据库中。例如: 根据converter

192.168.1.100 => 0:0:0:0:0:ffff:c0a8:164

问题在于 php 以不同的方式对待它们:

echo bin2hex(inet_pton('192.168.1.100'));
c0a80164

echo bin2hex(inet_pton('0:0:0:0:0:ffff:c0a8:164'));
00000000000000000000ffffc0a80164

echo bin2hex(inet_pton('0000:0000:0000:0000:0000:0000:192.168.1.100'));
000000000000000000000000c0a80164

对我来说,可以在数据库中毫无问题地进行 ip 比较(尤其是对于 ipv4)非常重要。

【问题讨论】:

  • IPv4 地址与 IPv6 地址不同。您无法将一种转换为另一种-它们是不同的野兽。 PHP 对待它们的方式不同也就不足为奇了。
  • AFAIK,IPv6 也兼容 IPv4。
  • @werva 那你就知道错了。网络之间有网关,但一般来说,它们是分开的。最好以简短的形式存储您的 IPv4 地址,以便更容易区分。
  • @glglgl,你的意思是我应该将它们存储到两个不同的表中?
  • @werva 否,但可能作为 varchar/varbinary,因此您可以立即检测到不同的长度,甚至可以为连接时所需的地址族字段添加一个字节。但后者是可选的;如果你只有 IPv4 和 IPv6 地址,那么长度就足够了。

标签: php ip ipv6


【解决方案1】:

我认为将 IPv4 地址完全存储为 IPv6 地址并不是一个好主意。

它们是完全不同的东西。

如果您运行的服务器在禁用IPV6ONLY 的情况下侦听 IPv6 套接字,您可能会遇到 :ffff: 版本。然后,您会注意到 IPv4 主机 192.168.1.100 连接为 ::ffff:c0a8:164。但是你不能通过 IPv6 连接到这个地址——为此,你需要一个 IPv4 套接字。所以最好以简短的形式存储地址,这样更容易通过长度来区分它们。

【讨论】:

  • 我发现这个link 也很有用。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多