2013-12-18 4 views
0

Я сделал короткую программу, в которой пользователь вводит 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 секунд между каждой проверки, чтобы убедиться, что он не откажет.

Итак, в чем проблема? И как я могу это решить?

+0

Когда вы говорите, что это сует, какая ошибка? – Mark

+0

Вы поймали какие-то исключения? – OmniOwl

+0

Ошибка. Я просто нажимаю кнопку запуска, кнопка запуска замораживается, и вся форма зависает. Даже если он иногда не падает после нескольких секунд, он переходит в режим «Не реагирует», и я ничего не могу сделать внутри него. Vipar, я поймал исключение подключения к сокету (чтобы проверить, включен или выключен компьютер), как вы можете видеть. – BlueRay101

ответ

1

Вы не можете выполнять бесконечный цикл while/sleep в потоке пользовательского интерфейса: поток пользовательского интерфейса необходим для обслуживания очереди событий Windows - и если это игнорируется, он не может рисовать и записывается как «не отвечает», ,

Вместо этого используйте либо таймер, либо фоновый рабочий стол.

+0

Спасибо, просто переместил это в другую тему, и он работает. – BlueRay101

1

Вы используете гнездо UDP. According to MSDN,

Поскольку протокол UDP является установление соединения, метод Connect не блок.

Ошибка будет Catch ed; таким образом, вы вводите бесконечный цикл в свой основной поток.

Предлагаемые решения:

  • Реализовать тест с использованием протокола TCP.
  • Переместите процедуру проверки на вторичную резьбу. Метод Connect не является асинхронным.

Теперь вы пытаетесь определить, жив или нет компьютер. Вы можете попытаться реализовать Ping. Вот аналогичный вопрос о, так что есть ответ от MEF, что решает эту проблему:

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

Надеется, что это работает для вас.

Смежные вопросы