我想將PHP中$_SERVER["REMOTE_ADDR"]
返回的數據存儲到DB字段中,很是簡單的任務。 問題是我沒法找到有關IPv6地址的文本表示的最大長度的任何正確信息,這是網絡服務器經過$_SERVER["REMOTE_ADDR"]
。 服務器
我對將文本表示轉換爲地址一般編碼的128位不感興趣,我只想知道存儲$_SERVER["REMOTE_ADDR"]
返回的任何IPv6地址須要多少個字符。 網絡
回答了我本身的問題: 編碼
IPv6地址一般寫爲八組,每組四個十六進制數字,每組用冒號(:)分隔。 spa
因此最多39個字符。 代理
45個字符 。 code
你可能指望一個地址 get
0000:0000:0000:0000:0000:0000:0000:0000
8 * 4 + 7 = 39 io
8組4位數字,7位:
它們之間。 搜索
可是若是你有一個IPv4映射的IPv6地址 ,那麼最後兩個組能夠用10分隔的基數寫入.
,例如。 [::ffff:192.168.100.228]
。 徹底寫出來: bug
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]
上面的地址。
我認爲@Deepak在這個連接中的答案更接近正確答案。 客戶端IP地址的最大長度 。 因此正確的大小是45而不是39.有時咱們試圖在字段大小中搜索,可是若是咱們準備足夠的存儲大小彷佛更好。
在Linux上,請參見常量INET6_ADDRSTRLEN
(包括<arpa/inet.h>
,請參閱man inet_ntop
)。 在個人系統上(標題「in.h」):
#define INET6_ADDRSTRLEN 46
最後一個字符用於終止NULL,正如我所說,因此最大長度爲45,與其餘答案同樣。
注意某些標題,例如HTTP_X_FORWARDED_FOR
,它們彷佛包含一個IP地址。 它們實際上可能包含多個地址(我假設的代理鏈)。
它們看起來是以逗號分隔的 - 而且可能總共超過45個字符 - 所以請在存儲到DB以前進行檢查。