![](/img/trans.png)
[英]C# await TcpClient ConnectAsync/ReadToEndAsync with timeout
[英]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.
}
我想添加一个设置表单(router-ip / user / password)。 因此,在用户端,如果用户键入不存在的host-ip,可能会出现故障。
当前超时大约是20秒 ,这太高了。 TcpClient.ReceiveTimeout
和TcpClient.SendTimeout
设置了正确的超时设置,因为我已经尝试过了。 Google并没有帮助我。
因此,谁知道该如何以正确的方式设置超时时间? 我已经了解了异步。 我不想使用的连接。 更干净的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!");
}
}
我知道的唯一方法是使用异步方法。 .Net 4.5中有一个不错的新异步方法,它返回一个可以等待的Task,如下所示:
tcpClient.ConnectAsync().Wait(timeout)
如果不成功,则返回false。
您正在使用的当前构造函数重载方法也正在连接,因此将您阻塞,直到连接为止。
此外 , TcpClient
上没有用于控制TcpClient
超时的属性。
从MSDN : TcpClient(String, Int32)
初始化TcpClient类的新实例,并连接到指定主机上的指定端口。
来自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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.