我得到一个字符串,代表ip地址。它的格式为ip:port 我需要生成IPAddress。将用于:
public static IPAddress Parse(
string ipString
)
我需要获取的IPAddress不应包含有关端口的数据。
parse
支持吗?如果不是怎么可能做到的?
答案 0 :(得分:3)
你需要完全知道你是否总是和你的IP
一起获得一个端口。如果你总是得到一个端口,那么你总是可以使用 Jon的代码并在最后一个冒号之后删除该部分。
ipString
然后你可以传递给IPAddress.TryParse
函数来获取IPAddress对象。
如果IPAddress.Parse
由于某种原因格式不正确,ipString
函数会给您一个例外。
现在为什么你必须完全知道字符串中port
的存在。
让我举个例子:
::213
- 绝对有效的IPV6地址。但它有两个不同的含义:
如果您已经知道必须有端口,则转换为0:0:0:0:0:0:0:0:213
。
但是如果你不知道那么这也意味着0:0:0:0:0:0:0:213
。
请注意,与上面的段相比,只有一个段。有效的IPV6总是有8个段,我给出的例子是IPV6地址的简写表示法。
假设你不知道你是否会在你的字符串中获得一个端口。然后你必须总是假设IPV6地址在long notation
。
在这种情况下,您可以检查存在的冒号计数(这仅适用于IPV6):(非常粗略的例子)
int colonCount = ipV6String.Count(c => c == ':');
int dotCount = ipV6String.Count(c=> c== '.');
if (((colonCount == 7) && (dotCount == 3)) ||
((colonCount == 8) && (dotCount == 0)))
{
//Port is present in the string
//Extract port using LastIndexOf
}
else
{
//Port NOT present
}
要使IPV4
可行,只需检查3 dots
和1 colon
有效IPAddresses
的一些示例(没有端口信息)
<强> IPV4 强>
x.x.x.x
<强> IPV6 强>
x:x:x:x:x:x:x:x
x:x:x:x:x:x:d.d.d.d
: : (short hand notation meaning all the segments are 0s)
x: x: : (means that the last six segments are 0s)
: : x : x (means that the first six segments are 0s)
x : x: : x : x (means the middle four segments are 0s)
请查看以下链接以获取有关IPAddress格式的信息:
http://publib.boulder.ibm.com/infocenter/dsichelp/ds8000ic/index.jsp?topic=%2Fcom.ibm.storage.ssic.help.doc%2Ff2c_internetprotocol_3st92x.html
http://publib.boulder.ibm.com/infocenter/ts3500tl/v1r0/index.jsp?topic=%2Fcom.ibm.storage.ts3500.doc%2Fopg_3584_IPv4_IPv6_addresses.html
答案 1 :(得分:2)
假设始终一个端口且始终由:<port number>
代表,您可以无条件地删除最后一个冒号后的部分:
int portStart = ipString.LastIndexOf(':');
ipString = ipString.Substring(0, portStart);
我希望这也适用于IPv6,除非你的IPv6&#34;地址和端口&#34;格式不使用冒号 - 这与RFC5952一样可行。基本上要做到这一点,你需要更多地了解你将要接收的格式。