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;
    }
}

IP 和 ping 类 .net - 在开发中工作,而不是在生产中工作

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 服务器连接到互联网。但是,这在任一方向上都有效。