如果用户为服务器输入了不正确的IP地址,则显示错误消息

本文关键字:地址 显示 消息 错误 IP 用户 服务器 输入 不正确 如果 | 更新日期: 2023-09-27 18:28:09

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

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

这里有一个片段显示了我的连接过程:

        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地址输入到文本框中,然后按下回车键或单击连接按钮以启动尝试块。

我对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);                
        }

现在,无论我是否成功连接,每次单击ConnectButton时都会收到"Unable to connect.."消息。

此外,在收到"无法连接.."消息后,我的代码将继续运行,而不是停留在原来的位置,并允许用户尝试输入正确的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地址,则显示错误消息

试试这个函数:

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是类的一部分,在单击按钮时调用相同的函数。如果无法访问,它将弹出消息。

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

试试下面的代码,它可能会帮助你

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