我试图连接到本地网络内的路由器。到目前为止,我一直使用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.ReceiveTimeout
和TcpClient.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();
}
}