我想通过存储返回的数据$_SERVER["REMOTE_ADDR"]
在PHP为DB场,相当简单的任务,真的。 问题是,我无法找到一个IPv6地址,这是一个网络服务器提供通过文字表述的最大长度适当的任何信息, $_SERVER["REMOTE_ADDR"]
我不感兴趣的文本表示转换为128位的地址通常是编码,我只是想知道需要多少个字符最大存储由返回的任何IPv6地址$_SERVER["REMOTE_ADDR"]
我想通过存储返回的数据$_SERVER["REMOTE_ADDR"]
在PHP为DB场,相当简单的任务,真的。 问题是,我无法找到一个IPv6地址,这是一个网络服务器提供通过文字表述的最大长度适当的任何信息, $_SERVER["REMOTE_ADDR"]
我不感兴趣的文本表示转换为128位的地址通常是编码,我只是想知道需要多少个字符最大存储由返回的任何IPv6地址$_SERVER["REMOTE_ADDR"]
45个字符 。
你可能期望的地址是
0000:0000:0000:0000:0000:0000:0000:0000
8 * 4 + 7 = 39
8组,每组4位7 :
在它们之间。
但是,如果你有一个IPv4映射的IPv6地址 ,最后两组可以写在相隔基地10 .
例如。 [::ffff:192.168.100.228]
。 写出完全:
0000:0000:0000:0000:0000:ffff:192.168.100.228
(6 * 4 + 5)+ 1 +(4 * 3 + 3)= 29 + 1 + 15 = 45
请注意,这是一个输入/显示惯例-它仍然是一个128位的地址和存储它很可能是最好的原料冒号隔开的格式,即规范[0000:0000:0000:0000:0000:ffff:c0a8:64e4]
对于上面的地址。
在Linux中,看到恒定INET6_ADDRSTRLEN
(包括<arpa/inet.h>
见man inet_ntop
)。 在我的系统(头“in.h中”):
#define INET6_ADDRSTRLEN 46
最后一个字符是终止NULL,因为我相信,这样的最大长度为45,其他的答案。
回答我的问题:
IPv6地址通常写为八组的四个十六进制数字,其中每个组由冒号(:)分隔。
所以这是最多39个字符。
我觉得在这个环节@Deepak答案更接近正确答案。 最大长度为客户端IP地址 。 所以,正确的尺寸是45不是39。有时候,我们尝试在领域规模攒够,但它似乎更好,如果我们准备好足够的存储容量。
如所指示的一个标准的IPv6地址是至多45个字符,但IPv6地址还可以包括结束%,其次是一个“范围”或“区域”的字符串,它不具有固定的长度,但通常是一个小的正整数或网络接口名字,所以在现实中,它可以超过45个字符更大。 网络接口名称通常为“eth0的”,将对“eth1”,“为wlan0”,所以选择50作为限制也很可能好。
当心某些标题如HTTP_X_FORWARDED_FOR
出现包含单个IP地址。 他们实际上可能包含多个地址(代理链我假设)。
他们将显示为逗号分隔 -并且可以更长很多超过45个字符合计-所以在DB存储前检查。