C# TcpClient Timeout



我试图连接到本地网络内的路由器。到目前为止,我一直使用TcpClient。

检查我的代码:

public static void RouterConnect()
        {    
            TcpClient tcpClient = new TcpClient("192.168.180.1",23); <-- Timeout comes up here
            tcpClient.ReceiveTimeout = 2000; // Not working
            tcpClient.SendTimeout = 2000; // Also not working
            NetworkStream nStream = tcpClient.GetStream(); <-- thought Timeout would raise here
            // Further code here. But already tested while commented out. 
            // So everything else expect the code above shouldnt be relevant.
        }

我想添加一个设置表单(路由器ip/用户/密码)。因此,当用户键入不存在的主机ip时,可能会在用户端出现失败。

当前的超时时间大约是20秒,这太高了。TcpClient.ReceiveTimeoutTcpClient.SendTimeout没有正确的超时设置,因为我已经尝试过了。Google并没有帮我解决这个问题。

那么,有人知道如何以正确的方式设置超时吗?我读过async。我不想使用的连接。一个更简洁的一行超时设置会更好。可能吗?

非常感谢!

编辑1:在调试时仔细观察,我注意到超时已经在tcpClient的初始化(如上面在我的代码中编辑的)时升高,而不是像我之前在.GetStream()时所想的那样。


编辑解决方案:

由于没有人发布我选择的解决方案的工作代码,下面是它的工作方式:

public static void RouterConnect()
        {
            TcpClient tcpClient = new TcpClient();
            if(tcpClient.ConnectAsync("192.168.80.1",23).Wait(TimeSpan.FromSeconds(2)))
            {
                NetworkStream nStream = tcpClient.GetStream();
            }
            else
            {
                MessageBox.Show("Could not connect!");
            }
        }

我知道的唯一方法是使用Async方法。在。net 4.5中有一个很棒的新异步方法,它返回一个任务,你可以像这样等待:

tcpClient.ConnectAsync().Wait(timeout)

如果不成功则返回false

是的,我认为最干净的方式是使用TcpClient。BeginConnect方法。

因此,无论您是否可以连接到端点,您都将获得异步反馈。还可以看看这个:异步连接

当前使用的构造函数重载方法也在连接,因此阻塞了您,直到它连接。

此外TcpClient上没有控制TcpClient超时的属性。

From MSDN: TcpClient(String, Int32)

初始化TcpClient类的新实例并连接到指定主机上的指定端口。

来自Social MSDN的备选代码

using (vartcp = new TcpClient())  
{  
    IAsyncResult ar = tcp.BeginConnect("192.168.180.1", 23, null, null);  
    System.Threading.WaitHandle wh = ar.AsyncWaitHandle;  
    try 
    {  
       if (!ar.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2), false))  
       {  
           tcp.Close();  
           throw new TimeoutException();  
       }  
        tcp.EndConnect(ar);  
    }  
    finally 
    {  
        wh.Close();  
    }  
} 

相关内容

  • 没有找到相关文章

最新更新