2013-08-16 56 views
-1

如何检查线程中是否有tcp端口?我尝试使用后台工作线程,并且工作,但更新速度相当缓慢。我想向我的UI线程报告进度。这是一个正确的方法吗?检查端口是否开放以连接到线程?

BackgroundWorker authStatus = new BackgroundWorker {WorkerReportsProgress = true}; 
    authStatus.DoWork += AuthStatusWork; 
    authStatus.ProgressChanged += AuthStatusProgressChanged; 

    public void AuthStatusWork(object sender, EventArgs e) 
    { 
     var thread = sender as BackgroundWorker; 

     using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
     { 
      socket.SendTimeout = 3; 
      while (true) 
      { 
       try 
       { 
        socket.Connect(auth[0], Convert.ToInt32(auth[1])); 
        if (thread != null) thread.ReportProgress(1); 
       } 
       catch (SocketException ex) 
       { 
        if (ex.SocketErrorCode != SocketError.ConnectionRefused && 
         ex.SocketErrorCode != SocketError.TimedOut) continue; 
        if (thread != null) thread.ReportProgress(0); 
       } 
      } 
     } 
    } 

    public void AuthStatusProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     switch (e.ProgressPercentage) 
     { 
      case 0: 
       AuthStatus.Foreground = Brushes.Red; 
       AuthStatus.Content = "Offline"; 
       break; 
      case 1: 
       AuthStatus.Foreground = Brushes.Green; 
       AuthStatus.Content = "Online"; 
       break; 
     } 
    } 
+0

你见过这个问题吗? http://stackoverflow.com/questions/570098/in-c-how-to-check-if-a-tcp-port-is-available – fassetar

+0

虽然我不想检查自己的ipaddress。 –

+0

我正在检查远程服务器的端口,看它是否可以连接到。 –

回答

2

使用异步连接,如下here

证明这将让你尝试,你要连接到尽可能多的远程TCP端口,让你知道当它成功或失败。您不必担心有多少线程已经启动或资源耗尽(套接字除外,无论采用何种方式,这都是问题)。

+0

我已经阅读了文章,但无法弄清楚什么时候连接是实际进行的,以及何时向我的UI线程发信号表示它已经发生。 –

0

我试图检查一个远程服务器的端口,看它是否可以连接到。

因此请尝试连接到它。试图以某种方式预测未来的这些游戏毫无意义。尝试连接并处理错误。这适用于任何资源:查看是否有任何资源可用的最佳方法是尝试使用它。

+0

确实,我同意,那我该怎么做呢? –