C#中探测网络地址是否联通
做项目时碰到了个问题,就是要往服务器上建立文件夹,那首先得判断服务器是可以联通,如果不同硬要建立就死等吧!从网上搜了一下,收集了几种方法:
方法一:在界面中添加两个TextBox和一个按钮,代码如下:
1 private void button1_Click(object sender, RoutedEventArgs e) 2 { 3 string ip = textBox1.Text; 4 string strRst = CmdPing(ip); 5 textBox2.Text = strRst; 6 } 7 8 private static string CmdPing(string strIp) 9 { 10 Process p = new Process(); 11 p.StartInfo.FileName = "cmd.exe"; 12 p.StartInfo.UseShellExecute = false; 13 p.StartInfo.RedirectStandardInput = true; 14 p.StartInfo.RedirectStandardOutput = true; 15 p.StartInfo.RedirectStandardError = true; 16 p.StartInfo.CreateNoWindow = true; 17 string pingrst; 18 p.Start(); 19 p.StandardInput.WriteLine("ping -n 1 " + strIp); 20 p.StandardInput.WriteLine("exit"); 21 string strRst = p.StandardOutput.ReadToEnd(); 22 if (strRst.IndexOf("(0% loss)") != -1) 23 pingrst = "连接"; 24 else if (strRst.IndexOf("Destination host unreachable.") != -1) 25 pingrst = "无法到达目的主机"; 26 else if (strRst.IndexOf("Request timed out.") != -1) 27 pingrst = "超时"; 28 else if (strRst.IndexOf("Unknown host") != -1) 29 pingrst = "无法解析主机"; 30 else 31 pingrst = strRst; 32 p.Close(); 33 return pingrst; 34 }
注:此方法就是调用cmd,获取返回的信息,根据返回的信息匹配字符判断,也算一种方法。如下运行截图:
方法二:此方法小巧,很容易理解。
1 private void button1_Click(object sender, RoutedEventArgs e) 2 { 3 string TestIP = textBox1.Text; 4 PingTest(TestIP); 5 } 6 7 public void PingTest(string ip) 8 { 9 Ping p = new Ping(); 10 PingOptions options = new PingOptions(); 11 options.DontFragment = true; 12 string data = "Test Data!"; 13 byte[] buffer = Encoding.ASCII.GetBytes(data); 14 int timeout = 1000; // Timeout 时间,单位:毫秒 15 PingReply reply = p.Send(ip, timeout, buffer, options); 16 if (reply.Status == IPStatus.Success) 17 { 18 textBox2.Text = "连接成功!"; 19 } 20 }
IPStatus 枚举:根据方法二中的IPStatus就可以得知ICMP的各种情况
BadDestination | 由于目标 IP 地址无法收到 ICMP 回送请求或者永远都不应当出现在任何 IP 数据报的目标地址字段中,ICMP 回送请求失败。 例如,调用 Send 并指定 IP 地址“000.0.0.0”将返回此状态。 | |
BadHeader | 由于标头无效,ICMP 回送请求失败。 | |
BadOption | 由于包含无效选项,ICMP 回送请求失败。 | |
BadRoute | 由于在源计算机和目标计算机之间没有有效的路由,ICMP 回送请求失败。 | |
DestinationHostUnreachable | 由于无法访问目标计算机,ICMP 回送请求失败。 | |
DestinationNetworkUnreachable | 由于无法访问包含目标计算机的网络,ICMP 回送请求失败。 | |
DestinationPortUnreachable | 由于目标计算机上的端口不可用,ICMP 回送请求失败。 | |
DestinationProhibited | 失败的ICMPv6 echo请求,因为与目标计算机的联系人控制中禁止。 此值仅适用于IPv6。 | |
DestinationProtocolUnreachable | 由于无法访问 ICMP 回送消息中指定的目标计算机,ICMP 回送请求失败,这是因为目标计算机不支持数据包的协议。 此值仅适用于IPv4。 此值IETF RFC 1812,将介绍消息管理上禁止。 | |
DestinationScopeMismatch | 由于 ICMP 回送消息中指定的源地址和目标地址不在同一范围内,ICMP 回送请求失败。 这通常是由于路由器使用了源地址范围以外的接口转发数据包所导致的。 地址范围(本地链接、本地站点和全局范围)确定地址在网络上的有效位置。 | |
DestinationUnreachable | 由于无法访问 ICMP 回送消息中指定的目标计算机,ICMP 回送请求失败;此问题的确切原因未知。 | |
HardwareError | 由于硬件错误,ICMP 回送请求失败。 | |
IcmpError | 由于 ICMP 协议错误,ICMP 回送请求失败。 | |
NoResources | 由于网络资源不足,ICMP 回送请求失败。 | |
PacketTooBig | 由于包含请求的数据包的大小超过了位于源和目标之间的节点(路由器或网关)的最大传输单位 (MTU),ICMP 回送请求失败。MTU 定义可传送数据包的最大大小。 | |
ParameterProblem | 由于节点(路由器或网关)在处理数据包标头时遇到问题,ICMP 回送请求失败。 例如,当标头包含无效的字段数据或无法识别的选项时会出现这种状况。 | |
SourceQuench | 由于已丢弃数据包,ICMP 回送请求失败。 当源计算机的输出队列中没有足够的存储空间时,或者当数据包到达目标过快而无法进行处理时,就会发生这种情况。 | |
Success | ICMP 回送请求成功;收到一个 ICMP 回送答复。 当收到此状态代码时,另一个 PingReply 属性包含有效的数据。 | |
TimedOut | 在所分配的时间内未收到 ICMP 回送答复。 允许的默认答复时间为 5 秒。 可以使用带 timeout 参数的 Send 或 SendAsync 方法更改此值。 | |
TimeExceeded | 由于数据包的生存时间 (TTL) 值达到零,导致转发节点(路由器或网关)将数据包丢弃,ICMP 回送请求失败。 | |
TtlExpired | 由于数据包的生存时间 (TTL) 值达到零,导致转发节点(路由器或网关)将数据包丢弃,ICMP 回送请求失败。 | |
TtlReassemblyTimeExceeded | 由于数据包被分割为片段以便传输,但在分配的时间内未收到所有片段以进行重组,ICMP 回送请求失败。RFC 2460(参见 www.ietf.org)将此时间限制指定为 60 秒,60 秒内必须收到所有数据包片段。 | |
Unknown | 由于未知原因,ICMP 回送请求失败。 | |
UnrecognizedNextHeader | 由于“下一标头”字段中没有可识别的值,ICMP 回送请求失败。“下一标头”字段指示扩展标头类型(如果存在的话)或者 IP 层之上的协议(例如,TCP 或 UDP)。 |
网上还有很多方法,就不一一列举了。