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

标签 c# exception server client ip-address

我有一个客户端/服务器应用程序,用户需要输入服务器的 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 地址,然后按回车键或单击连接按钮以启动 try block 。

我是 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 地址给它。这样我就可以阻止应用程序在连接尝试失败时卡住。

最佳答案

试试这个功能:

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

关于c# - 如果用户输入的服务器 IP 地址不正确,则显示错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34488497/

相关文章:

linux - 如何将文本文件中的一定数量的数字数据添加到 gnuplot 中?

c# - 对于从星期一开始的 DayOfWeek 枚举的每个循环?

objective-c - cocoa 中 try/catch 内部的错误传播

javascript - jquery 3.1.1 错误 : Object doesn't support property or method 'andSelf'

javascript - Photoswipe 无法读取 photoswipe.js 第 1070 行未定义的属性 'center'

java - 在 JUnit 测试之前我应该​​如何启动服务器?

python - 安装 pip 而无需 root 失败

C# vs Java HmacSHA1 然后是 base64

c# - 在命令中移动滚动条

c# - 如何通过 C# 代码获取系统类型?