首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c#是否正在检查端口是否正在进行主动侦听?

c#是否正在检查端口是否正在进行主动侦听?
EN

Stack Overflow用户
提问于 2011-09-11 01:54:11
回答 2查看 14.4K关注 0票数 3

我使用以下代码来实现此目标:

代码语言:javascript
复制
    public static bool IsServerListening()
    {
        var endpoint = new IPEndPoint(IPAddress.Parse("201.212.1.167"), 2593);
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try
        {
            socket.Connect(endpoint, TimeSpan.FromSeconds(5));
            return true;
        }
        catch (SocketException exception)
        {
            if (exception.SocketErrorCode == SocketError.TimedOut)
            {
                Logging.Log.Warn("Timeout while connecting to UO server game port.", exception);
            }
            else
            {
                Logging.Log.Error("Exception while connecting to UO server game port.", exception);
            }

            return false;
        }
        catch (Exception exception)
        {
            Logging.Log.Error("Exception while connecting to UO server game port.", exception);
            return false;
        }
        finally
        {
            socket.Close();
        }
    }

下面是我对Socket类的扩展方法:

代码语言:javascript
复制
public static class SocketExtensions
{
    public const int CONNECTION_TIMEOUT_ERROR = 10060;

    /// <summary>
    /// Connects the specified socket.
    /// </summary>
    /// <param name="socket">The socket.</param>
    /// <param name="endpoint">The IP endpoint.</param>
    /// <param name="timeout">The connection timeout interval.</param>
    public static void Connect(this Socket socket, EndPoint endpoint, TimeSpan timeout)
    {
        var result = socket.BeginConnect(endpoint, null, null);

        bool success = result.AsyncWaitHandle.WaitOne(timeout, true);
        if (!success)
        {
            socket.Close();
            throw new SocketException(CONNECTION_TIMEOUT_ERROR); // Connection timed out.
        }
    }
}

问题是这段代码可以在我的开发环境中工作,但当我将它移到生产环境中时,它总是超时(无论我将超时间隔设置为5秒还是20秒)。

是否有其他方法可以检查该IP是否在该特定端口上进行主动侦听?

为什么我不能在我的托管环境中做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-11 02:02:58

您可以从命令行运行netstat -na来查看所有(包括侦听)端口。

如果添加-b,您还将看到链接到每个连接/侦听的可执行文件。

在.NET中,您可以使用System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()获取所有侦听连接

票数 9
EN

Stack Overflow用户

发布于 2011-09-16 17:54:02

您可以使用以下代码进行检查:

代码语言:javascript
复制
       TcpClient tc = new TcpClient();
       try
       {

           tc.Connect(<server ipaddress>, <port number>);
           bool stat = tc.Connected;
           if (stat)
               MessageBox.Show("Connectivity to server available."); 

           tc.Close();
       }
       catch(Exception ex)
       {
           MessageBox.Show("Not able to connect : " + ex.Message);
           tc.Close();
       }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7373537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档