2013-12-18 40 views
0

我已经做了一个简短的程序,用户输入计算机的IP地址,然后程序继续通过尝试连接到端口80来检查计算机是否在线(假设是if一台电脑打开,它连接到互联网)。套接字程序冻结

现在,问题是,每次我点击开始按钮它什么也不做,然后它崩溃。

下面的代码:

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秒钟的延迟,以确保它不会崩溃。

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

+0

当你说它发疯时,有什么错误? – Mark

+0

你有没有发现任何异常? – OmniOwl

+0

没有错误。我只要点击开始按钮,开始按钮就会冻结,整个表格会冻结。即使它在几秒钟后有时不会崩溃,它会进入“Not Responding”模式,但我无法在其中做任何事情。如您所见,我发现了套接字连接异常(检查计算机是否开启/关闭)。 – BlueRay101

回答

1

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

请考虑计时器或后台工作者。

+0

谢谢,只是将其移至不同的线程并且它可以工作。 – BlueRay101

1

你正在实现一个UDP套接字。 According to MSDN

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

将不会有错误Catch ed;因此,您在主线程上输入了一个无限循环。

建议的解决方法:

  • 实现使用TCP协议测试。
  • 将检查过程移动到辅助线程。 Connect方法不是异步的。

现在,您正试图确定一台计算机是否还活着。您可以尝试实施Ping。下面是有一个答案从MEF解决此问题上的SO一个类似的问题:

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

希望它为你工作。