簡體   English   中英

IP和Ping類.Net-在開發中工作而不在生產中?

[英]IP and Ping Class .Net - Works in Development not in Production?

因此,我實施了Ping課堂的各種方法,其中包括我因Vinjay BR找到的最全面的方法 但是,我似乎無法獲得任何可用於生產的解決方案。 我可以在VS 2015中使用它,但這並不是說太多,因為我認為PING甚至都不會離開我的網絡(我絕對不是網絡專家,所以這是一個假設)。 我還必須在下面僅使用數組元素0來實現Split(“:”)方法,因為如果我不這樣做,則IPAddress類將在核心IPAddress的末尾捕獲帶有“:4321”的IP地址。 我已經嘗試使用完整的地址和截斷的地址,但是兩種方法都不起作用。 我使用了帶有截斷地址的cmd.exe 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.Send()時提供它。

如果您查看MSDN 上Ping文檔 ,則會發現該短語的用法很隨意。

嘗試發送Internet控制消息協議(ICMP)回顯消息

嘗試是有效的詞。 許多服務器配置為不響應ping請求,許多防火牆阻止此類請求。

您的代碼在本地工作。 如果服務器的IP地址正確,則代碼應該正確。 失敗的最可能原因是網絡基礎結構或服務器阻止了請求的完成。

要測試假設,請在客戶端計算機上打開命令提示符,然后輸入

ping 1.2.3.4

用實際的IP地址替換1.2.3.4。 如果沒有收到答復,則說明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服務器連接 Internet的問題。 但是,這在任一方向上都有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM