套接字程序冻结

时间:2013-12-18 16:28:48

标签: c# sockets networking user-interface

我做了一个简短的程序,用户输入计算机的IP地址,然后程序通过尝试使用端口80连接计算机来检查计算机是否在线(假设计算机是打开,它连接到互联网)。

现在问题是,每当我点击“开始”按钮时,它几秒钟内什么都不做,然后崩溃。

以下是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Online_Checker
{
    public partial class Form1 : Form
    {
        int success;
        Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress.Text), 80);
            while (true)
            {
                success = 1;
                try { client.Connect(ep); }
                catch { status.BackColor = Color.Red; status.Text = "OFFLINE"; success = 0; }
                if (success == 1)
                {
                    status.BackColor = Color.Red;
                    status.Text = "ONLINE";
                    client.Close();
                }
                Thread.Sleep(5000);
            }
        }
    }
}

正如您所看到的,我甚至在每次检查之间延迟了5秒钟,以确保它不会崩溃。

那么问题出在哪里?我该如何解决?

2 个答案:

答案 0 :(得分:1)

您不能在UI线程上执行无限的while / sleep循环:UI线程需要为Windows事件队列提供服务 - 如果忽略它,则无法绘制并记录为“无响应”。

请考虑使用计时器或后台工作人员。

答案 1 :(得分:1)

您正在实施UDP套接字。 According to MSDN

  

由于UDP协议是无连接的,Connect方法不是   块。

Catch没有错误;因此,你在主线程上输入一个无限循环。

建议的解决方案:

  • 使用TCP协议实施测试。
  • 将检查程序移至辅助线程。 Connect方法不是异步的。

现在,您正在尝试确定计算机是否处于活动状态。您可以尝试实现Ping。这是一个关于SO的类似问题,它有 mef 的答案来解决这个问题:

What is the best way to check for Internet connectivity using .NET?

希望它适合你。