【问题标题】:Show error message if user inputs incorrect IP Address for server如果用户输入的服务器 IP 地址不正确,则显示错误消息
【发布时间】:2016-04-02 00:09:03
【问题描述】:

我有一个客户端/服务器应用程序,用户需要输入服务器的 IP 地址才能连接到它。如果用户输入的不是 IP 地址,我会得到一个未处理的异常。如果用户输入了错误的 IP 地址,应用程序将完全冻结并必须强制关闭。

如果用户输入了 IP 地址以外的内容(而不是显示未处理的异常错误),我已经设法使用 try-catch 来弹出友好的错误消息,这允许他们重试。但是如果用户输入 IP 地址,我不知道如何弹出相同的消息框,但它是错误的 IP 地址(以避免程序冻结)。

这是一个显示我的连接过程的 sn-p:

        try
        {
            System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + @"/ServerIP.cfg", ServerIPbox.Text);
            string ServerIP = System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + @"/ServerIP.cfg");
            serverEndPoint = new IPEndPoint(IPAddress.Parse(ServerIP), 8888);
        }

        catch (FormatException)
        {
            MessageBox.Show("Invalid IP address");
            return;
        }
        catch (SocketException)
        {
            return;
        }

在我的客户端应用程序中;用户在文本框中输入运行服务器应用程序的机器的 IP 地址,然后按 Enter 或单击连接按钮以启动 try 块。

我对 C# 还很陌生,所以我不确定这是否可行;但理想情况下,我希望客户端能够在尝试连接之前检查输入的 IP 地址是否实际上是服务器的 IP 地址。这样我就可以完全避免异常,而且这似乎是正确的方法,而不是在友好的弹出窗口后面隐藏错误消息。


编辑:我尝试使用 Darshan Patel 的答案,但遇到了一些问题。首先,这是我的代码:

private void ConnectButton_Click(object sender, EventArgs e)
    {            
                System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + @"/ServerIP.cfg", ServerIPbox.Text);
                string ServerIP = System.IO.File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + @"/ServerIP.cfg");
        try
        {
            var myRequest = (HttpWebRequest)WebRequest.Create(ServerIP);
            var response = (HttpWebResponse)myRequest.GetResponse();

            if (response.StatusCode == HttpStatusCode.OK)
            {
                serverEndPoint = new IPEndPoint(IPAddress.Parse(ServerIP), 8888);

                //CONNECT TO SERVER

                Client.Connect(serverEndPoint);
                SendMessage("Client Connected (" + DateTime.Now + ")");
            }
        }

        catch (Exception ex)
        {
            MessageBox.Show("Unable to connect : " + ex.Message);                
        }

现在我每次单击连接按钮时都会收到“无法连接..”消息,无论我是否成功连接。

此外,在收到“无法连接..”消息后,我的代码继续运行,而不是停留在原来的位置并允许用户尝试输入正确的 IP 地址。


编辑 2:这是修改我的原始代码的另一种尝试:

private void ConnectButton_Click(object sender, EventArgs e)
    {            
        try
        {
            //ATTEMPT TO CONNECT TO SERVER
            serverEndPoint = new IPEndPoint(IPAddress.Parse(ServerIPbox.Text), 8888);
            Client.Connect(serverEndPoint);
        }

        //INCORRECT IP ADDRESS WAS ENTERED
        catch (Exception)
        {
            MessageBox.Show("Please enter a valid IP address");
            return;
        }

        //SUCCESSFULLY CONNECTED TO SERVER
        System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + @"/ServerIP.cfg", ServerIPbox.Text);

在此尝试中,我的代码捕获了任何不是 IP 地址的内容,并在将其写入“ServerIP.cfg”文件之前将其停止,并显示“无效 IP 地址”消息,允许用户重试。

一旦用户输入 IP 地址,它就会被保存到“ServerIP.cfg”文件中,并且(理想情况下)它们会连接到服务器。

唯一的问题是;如果用户输入了 IP 地址,但它不是运行服务器的机器的 IP,则应用停止响应。

如果用户输入 9 个数字的任意组合(程序似乎认为是 IP 地址),应用也会停止响应

在让程序尝试连接之前,我需要一种可靠的方法来检查用户输入的 IP 地址(或 9 个数字)实际上是否是运行服务器的机器的正确 IP 地址给它。这样我就可以阻止应用在连接尝试失败时冻结。

【问题讨论】:

  • IP地址指向服务器?
  • 如果您问“IP 地址是否指向服务器?”答案是肯定的。
  • ServerIP 的输出是什么???
  • ServerIP 是用户在 textbox.text 中输入的 IP 地址,我将其保存到 ServerIP.cfg,这样他们就不必每次登录客户端时都输入 IP 地址

标签: c# exception server client ip-address


【解决方案1】:

试试这个功能:

System.Net.NetworkInformation;

public static bool PingHost(string nameOrAddress)
{
    bool pingable = false;
    Ping pinger = new Ping();
    try
    {
        PingReply reply = pinger.Send(nameOrAddress);
        pingable = reply.Status == IPStatus.Success;
    }
    catch (PingException)
    {
        // Discard PingExceptions and return false;
    }
    return pingable;
}

以上可以用作:

private void button9_Click(object sender, EventArgs e)
    {
        string serverIP = "192.168.3.213";
        bool result = PingHost(serverIP);
        if (result)
        {
            // connected successfully 
            // do the core logic here
        }
        else
        {
            MessageBox.Show("Unable to connect to server!, Check your Server IP address");
        }

    }

函数 PingHost 是该类的一部分,在按钮单击中也将调用该函数。如果无法访问,它将弹出消息。

【讨论】:

  • 我将如何使用这种方法告诉我的客户端是否允许连接到特定的 IP 地址? IE。我会在你的函数的哪个部分插入告诉我的客户端连接到 IP 地址的代码?
  • 您正在从 Server.cgf 文件中获取 Ip。只需将其传递给 Function PingHost(IPADRESS) 。如果 pinghost 返回 true 。一切都完成了。否则,如果它返回 false,则向用户打印一条消息
  • 抱歉听起来像个菜鸟,但我需要把函数放在它自己的方法中,还是放在一个类中?
  • 我已经编辑了答案以使其简单,提出疑问总是好的,
  • 对不起,我错过了using System.Net.NetworkInformation; 我想现在可能已经修复了,我会在一分钟内报告
【解决方案2】:

试试下面的代码可能对你有帮助

try
{
    var myRequest = (HttpWebRequest)WebRequest.Create("http://192.168.0.1");
    // Here "http://192.168.0.1" is your server ip address.
    var response = (HttpWebResponse)myRequest.GetResponse();

    if (response.StatusCode == HttpStatusCode.OK)
    {
        MessageBox.Show("Connected");
        // do your stuff.
    }
}
catch (Exception ex)
{
    MessageBox.Show("Unable to connect : " + ex.Message);
}

【讨论】:

  • 这是否适用于未知的服务器 IP 地址?用户需要输入他们服务器的 IP 地址,因为应用程序还不知道它。在这种情况下,我必须用我的 (ServerIP) 字符串替换“192.168.0.1”。应该可以吗?
  • ServerIP 是用户在 textbox.text 中输入的 IP 地址,我将其保存到 ServerIP.cfg,这样他们就不必每次登录客户端时都输入 IP 地址
【解决方案3】:

我认为您可以在进行实际连接之前尝试ping operation(超时)。如果您使用的是 tcp 连接,则可以设置其他解决方法连接超时属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-19
    • 2021-04-15
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多