IP 和 ping 类 .net - 在开发中工作,而不是在生产中工作
本文关键字:工作 生产中 开发 ping net IP | 更新日期: 2023-09-27 18:35:14
所以我实现了Ping Class的各种方法,包括我发现的最全面的方法,这要归功于Vinjay B R。但是,我似乎无法获得任何在生产中工作的解决方案。 我可以让它在VS 2015中工作,但这并不能说明什么,因为我认为PING甚至不会离开我的网络(我绝对不是网络专家,所以这是一个假设)。 我还必须实现下面的 Split(":") 方法,只采用数组元素 0,因为如果我不这样做,IPAddress 类会在核心 IPAddress 的尾端捕获带有":4321"的 IP 地址。 我已经尝试了完整的地址和截断的地址,但这两种方法都不起作用。 我已经使用带有截断地址的 cmd.exe Ping 命令来检查两者,我只能使用截断的 ping 来完成 ping,所以我让 Split() 继续发挥作用。 我不知所措,希望有人看到是一头大象。 我的生产服务器是 Azure,如果有帮助?
目前它正在抛出PingException捕获。
public class PingTest
{
public void Pinger()
{
SpeedTest Test = new SpeedTest();
IPAddress ip = new IPAddress();
var clientIP = ip.GetIPAddress();
string[] IPAddresses = clientIP.Split(':');
string address = IPAddresses[0];
//set the ping options, TTL 128
PingOptions pingOptions = new PingOptions(128, true);
//create a new ping instance
Ping ping = new Ping();
//32 byte buffer (create empty)
byte[] buffer = new byte[32];
//here we will ping the host 4 times (standard)
for (int i = 0; i < 4; i++)
{
try
{
//send the ping 4 times to the host and record the returned data.
//The Send() method expects 4 items:
//1) The IPAddress we are pinging
//2) The timeout value
//3) A buffer (our byte array)
//4) PingOptions
PingReply pingReply = ping.Send(address, 1000, buffer, pingOptions);
//make sure we dont have a null reply
if (!(pingReply == null))
{
switch (pingReply.Status)
{
case IPStatus.Success:
Test.Address = pingReply.Address.ToString();
Test.ResponseTime = pingReply.RoundtripTime.ToString() + " ms";
Test.Status = pingReply.Status.ToString();
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
break;
case IPStatus.TimedOut:
Test.Address = pingReply.Address.ToString();
Test.ResponseTime = "";
Test.Status = "Connection has timed out...";
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
break;
default:
Test.Address = pingReply.Address.ToString();
Test.ResponseTime = "";
Test.Status = pingReply.Status.ToString();
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
break;
}
}
else
{
Test.Address = pingReply.Address.ToString();
Test.ResponseTime = "";
Test.Status = "Connection failed for an unknown reason...";
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
}
}
catch (PingException ex)
{
Test.Address = address;
Test.ResponseTime = "";
Test.Status = string.Format("Connection Error: {0}", ex.Message);
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
}
catch (SocketException ex)
{
Test.Address = address;
Test.ResponseTime = "";
Test.Status = string.Format("Connection Error: {0}", ex.Message);
Test.UserId = User.Identity.GetUserId();
Test.TestDate = DateTime.Now;
Test.TestType = "Ping";
}
}
using (ApplicationDbContext db = new ApplicationDbContext())
{
db.SpeedTest.Add(Test);
db.SaveChanges();
}
}
}
获取 IP 地址:
public class IPAddress
{
public string GetIPAddress()
{
//The X-Forwarded-For (XFF) HTTP header field is a de facto standard for identifying the originating IP address of a
//client connecting to a web server through an HTTP proxy or load balancer
String ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ip))
{
ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
return ip;
}
}
IPAddress 类捕获尾端带有":4321"的 IP 地址
:4321 部分是一个端口号。不应在调用 ping 时提供它。发送()。
如果您查看MSDN上的Ping文档,您会发现该短语的自由使用
。尝试发送互联网控制消息协议 (ICMP) 回显消息
尝试是有效的词。许多服务器配置为不响应 ping 请求,并且许多防火墙阻止此类请求。
您的代码在本地工作。如果您有正确的服务器 IP 地址,则代码应该正确。失败的最可能原因是网络基础结构或服务器阻止请求完成。
若要测试假设,请在客户端计算机上打开命令提示符,然后输入
平 1.2.3.4
将 1.2.3.4 替换为实际 IP 地址。如果您没有收到回复,则 ping 将被阻止,您的代码也无法完成 ping。
我的生产服务器是 Azure,如果有帮助?
是的,确实如此。
不允许通过 Azure 负载均衡器使用 ICMP 协议。
http://blogs.msdn.com/b/mast/archive/2014/06/22/use-port-pings-instead-of-icmp-to-test-azure-vm-connectivity.aspx
然而,一切都没有丢失。可以使用 PsPing 等工具来测试服务器上端口(如 HTTP 端口 80)的可用性。请注意,本文讨论的是从 Azure 服务器连接到互联网。但是,这在任一方向上都有效。