C#TcpClient超时

时间:2015-07-15 18:28:18

标签: c# timeout tcpclient networkstream socketexception

我试图连接到本地网络内的路由器。到目前为止我已经使用过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.
        }

我想添加一个设置表单(router-ip / user / password)。因此,用户可能会在用户输入不存在的host-ip时失败。

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

那么,有谁知道如何以正确的方式为此设置超时?我读过有关异步的内容。我不想使用的连接。一个更干净的1行超时设置会很好。可能的?

非常感谢!

编辑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!");
            }
        }

2 个答案:

答案 0 :(得分:1)

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

tcpClient.ConnectAsync().Wait(timeout)

如果不成功,则返回false。

答案 1 :(得分:0)

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

因此,无论您是否可以连接到端点,都会得到异步反馈。 另见: Async Connect