【问题标题】:How to set test TCP connection timeout?如何设置测试 TCP 连接超时?
【发布时间】:2011-06-02 19:16:00
【问题描述】:

我尝试使用以下代码测试 TCP 连接。

System.Threading.Thread t = new System.Threading.Thread(() =>
{      
    using (TcpClient client = new TcpClient())
    {
        client.Connect(ip, Convert.ToInt32(port));
    }
});
t.Start();

如果IP或端口无效,如何设置超时?

【问题讨论】:

标签: c# .net tcp connection settimeout


【解决方案1】:

对于 OP 来说已经太晚了,但对于仍然从搜索中找到此页面的其他人来说,您可以使用 .Net 4.5 中引入的异步编程功能来解决这个问题。

var hostname = "127.0.0.1";
var port = 123;
var timeout = TimeSpan.FromSeconds(3);
var client = new TcpClient();
if (!client.ConnectAsync(hostname, port).Wait(timeout))
{
    // timed out
}

【讨论】:

    【解决方案2】:

    没有内置的方法可以做到这一点。我对我们的许多应用程序使用以下代码。该代码绝不是原始的,但可以正常工作。请注意,您可能必须向此函数添加重试...有时即使服务器已启动并正在运行,它也会返回 false。

      private static bool _TryPing(string strIpAddress, int intPort, int nTimeoutMsec)
        {
            Socket socket = null;
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, false);
    
    
                IAsyncResult result = socket.BeginConnect(strIpAddress, intPort, null, null);
                bool success = result.AsyncWaitHandle.WaitOne(nTimeoutMsec, true);
    
                return socket.Connected;
            }
            catch
            {
                return false;
            }
            finally
            {
                if (null != socket)
                    socket.Close();
            }
        }
    

    【讨论】:

    • 嗨,我有 2 个代码问题: 1. 计划使用的未使用变量成功是什么? 2. 如果我尝试你的代码示例,我会在 socket.Close() 之后得到一个 ObjectDisposedException。会是什么?
    • 变量success没有用...我只是以我正在使用的部分代码为例。这里的一般想法是您启动异步连接并等待连接成功或超时。然后检查套接字的连接状态。
    【解决方案3】:

    没有直接的方法来实现它,但是一种方法可以是有一个单独的方法来测试连接。

     static bool TestConnection(string ipAddress, int Port, TimeSpan waitTimeSpan)
            {
                using (TcpClient tcpClient = new TcpClient())
                {
                    IAsyncResult result = tcpClient.BeginConnect(ipAddress, Port, null, null);
                    WaitHandle timeoutHandler = result.AsyncWaitHandle;
                    try
                    {
                        if (!result.AsyncWaitHandle.WaitOne(waitTimeSpan, false))
                        {
                            tcpClient.Close();
                            return false;
                        }
    
                        tcpClient.EndConnect(result);
                    }
                    catch (Exception ex)
                    {
                        return false;
                    }
                    finally
                    {
                        timeoutHandler.Close();
                    }
                    return true;
                }
            }
    

    这个方法会使用一个WaitHandle,它会等待指定的时间段来建立连接,如果它及时连接,它会关闭连接并返回true,否则它会超时并返回false。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2022-01-20
    • 2019-10-05
    • 2015-09-07
    • 2013-01-24
    相关资源
    最近更新 更多