C# IP和Ping Class.Net-正在开发中而不是在生产中?
所以我已经实现了各种方法,包括我发现的那个种。然而,我似乎无法在生产中找到任何可行的解决方案。我可以让它在VS 2015中发挥作用,但这并不能说明什么,因为我认为PING甚至不会离开我的网络(我绝对不是网络专家,所以这是一个假设)。我还必须实现下面的拆分(“:”)方法,只使用数组元素0,因为如果我不这样做,IPAddress类将捕获一个IP地址,在核心IPAddress的末尾带有“:4321”。我尝试了完整地址和截断地址,但两种方法都不起作用。我使用了带有截断地址的cmd.exe Ping命令来检查两者,我只能使用截断地址来完成Ping,因此我将Split()保留在运行中。我不知所措,希望有人看到这是一头大象。我的生产服务器是Azure,如果有帮助的话 目前它正在抛出PingException捕获C# IP和Ping Class.Net-正在开发中而不是在生产中?,c#,.net,networking,ping,C#,.net,Networking,Ping,所以我已经实现了各种方法,包括我发现的那个种。然而,我似乎无法在生产中找到任何可行的解决方案。我可以让它在VS 2015中发挥作用,但这并不能说明什么,因为我认为PING甚至不会离开我的网络(我绝对不是网络专家,所以这是一个假设)。我还必须实现下面的拆分(“:”)方法,只使用数组元素0,因为如果我不这样做,IPAddress类将捕获一个IP地址,在核心IPAddress的末尾带有“:4321”。我尝试了完整地址和截断地址,但两种方法都不起作用。我使用了带有截断地址的cmd.exe Ping命令来
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();
}
}
}
IPAddress类捕获尾端带有“:4321”的IP地址
:4321部分是端口号。不应在对ping.Send()的调用中提供它
如果您查看MSDN上的,您将看到该短语的自由使用
尝试发送Internet控制消息协议(ICMP)回显消息
尝试是关键。许多服务器配置为不响应ping请求,并且许多防火墙阻止此类请求
您的代码在本地工作。如果您有正确的服务器IP地址,代码应该是正确的。失败的最可能原因是网络基础设施或服务器阻止请求完成
要测试该假设,请在客户端计算机上打开命令提示符,然后输入
平1.2.3.4
将1.2.3.4替换为实际IP地址。如果您没有收到回复,ping将被阻止,您的代码也将无法完成ping
我的生产服务器是Azure,如果有帮助的话
是的
不允许通过Azure负载平衡器使用ICMP协议
然而,一切都没有失去。您可以使用工具(如)测试服务器上端口(如HTTP端口80)的可用性。请注意,本文讨论了从Azure服务器连接到internet的问题。但是,这在两个方向都有效。我觉得很奇怪,
IPAddress.GetIPAddress()
会在结果中附加端口号。我觉得没道理,试试看。幸运的是,我花了一段时间来解决这个问题,以实现split()方法。我错过了你自己制作的IPAddress
课程。所以。。如果我弄错了,请告诉我。。。某人与您的web服务器建立HTTP连接,您获取他们的IP地址,并尝试ping他们。那似乎有点。。。傻<代码>1Ping(ICMP消息)不保证到达2
事实上,您与客户端建立了连接,这表明他们的计算机正在运行。我们有一些实验室,用户可以连接到这些实验室学习课程。实验室团队想要一个speedtest.net类型的应用程序,显示给定用户的ping响应时间和下载速度。我已经完成了下载,但是我一直在确定Ping响应。从逻辑上讲,我同意你的观点,如果他们登录了,那么他们就可以连接了。也就是说,我不是网络专家,所以他们可能有其他原因需要Ping响应时间。谢谢,埃里克。听起来我的代码是正确的,但是Azure阻止我执行它?我在一个应用程序中使用它来测试用户是否可以连接到我们的电子实验室所在的基础设施。我正在利用Azure进行测试,但最终该应用程序将在我们的防火墙后运行。我们的客户可以是任何人,从拥有本地ISP的现成笔记本电脑到政府雇员。PSP是否允许我在客户端动态搜索打开的端口?抱歉我的无知,网络不是我的强项。听起来我的代码是正确的,但是Azure阻止我执行它?
代码执行,但是Azure阻止网络消息传入或传出Azure网络。用于Ping的控制消息类型通常被阻止(因为可能会被滥用),并且也不能表示客户端是否能够实际连接。如果客户端将连接到特定端口,只需测试该端口的可用性。如果这是一个网站,请添加一个没有身份验证的页面,例如status.html,然后尝试从您的客户端代码加载该页面。如果我能找到Azure上的开放端口,ping.Send()是否有一个用于定位开放端口的参数?PSP是否允许我动态搜索客户端上的开放端口
是,但是,如果您经常对许多端口执行此操作,Azure或客户端网络中的网络安全软件可能会将您误认为黑客。如果我能找出Azure上的开放端口,ping.Send()是否有针对开放端口的参数?
否,它发送的ICMP控制消息与您可能通过应用程序端口发送的TCP/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;
}
}