【发布时间】:2013-02-13 11:01:09
【问题描述】:
我正在编写一个应用程序来存储请求来自的 IP 地址。这些 IP 地址将作为 varbinary(16) 存储在我的数据库中。很明显,varbinary(16) 的大小不合适。目前,我正在使用以下代码将请求的 IP 地址转换为 byte[];
HttpRequestMessage request = GetRequestMessage();
string ipAddress = string.Empty;
if (request.Properties.ContainsKey("MS_HttpContext"))
{
ipAddress = ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
}
else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
RemoteEndpointMessageProperty property = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
ipAddress = property.Address;
}
byte[] bytes = new byte[ipAddress.Length * sizeof(char)];
System.Buffer.BlockCopy(ipAddress.ToCharArray(), 0, bytes, 0, bytes.Length);
// What is the maximum size of bytes?
我注意到字节的长度为 26。我的问题是,如果我需要支持 IPv6 地址,字节的最大大小是多少?我需要知道将varbinary(16) 的大小更改为适当的长度。
谢谢!
【问题讨论】:
-
只是一个旁注——每个人都在说
varbinary(16),但是既然你知道你想要存储正好16个字节,你可以使用binary(16)来代替,并且失去了可变长度的开销。或者正如@PhonicUK 所说,uniqueidentifier也可以。 -
除了 varbinary(16) 也可以有效地存储 IPv4 地址。
-
@tomfanning 好点。每次检索数据时,您都必须查看数据的大小,看看它是 4 字节还是 16 字节才能使用它,但如果您有很多记录并且有很大比例的它们是 v4。
-
@JoeEnos 如果您只是从数据库中获取字节数组并将其传递给
System.Net.IPAddress的构造函数,则会生成正确族的实例。来自文档:“如果地址的长度为 4,则 IPAddress(Byte[]) 构造一个 IPv4 地址;否则,构造一个范围为 0 的 IPv6 地址。”编写使用 IPAddress 的代码有助于编写适用于 IPv4 和 IPv6 的代码。 -
@tomfanning 酷,不知道这都是内置的。