检查端口是否已打开以连接到线程?

时间:2013-08-16 03:01:05

标签: c# .net sockets tcp port

如何检查线程中是否有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;
        }
    }

2 个答案:

答案 0 :(得分:2)

使用异步连接,如here

所示

这将允许您尝试连接到任意数量的远程TCP端口,并在成功或失败时通知您。您不必担心已经启动或耗尽了多少线程资源(除了套接字,无论采用何种方法,这都是一个问题)。

答案 1 :(得分:0)

  

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

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