C# TcpClient 超时
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)。因此,在用户输入不存在的主机 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!");
}
}
是的,我认为最干净的方法是使用 TcpClient.BeginConnect
方法。
因此,无论您是否可以连接到端点,您都会收到异步反馈。
另请参阅:
Async Connect
您当前使用的构造函数重载方法也在连接,因此会阻塞您直到它连接。
此外,TcpClient
上没有属性来控制TcpClient
超时。
来自 MSDN:TcpClient(String, Int32)
Initializes a new instance of the TcpClient class and connects to the
specified port on the specified host.
来自 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();
}
}
我知道的唯一方法是使用异步方法。
.Net 4.5 中有一个不错的新异步方法,它 returns 一个您可以像这样等待的任务:
tcpClient.ConnectAsync().Wait(timeout)
如果不成功,则 returns 为 false。
我正在尝试连接到本地网络中的路由器。到目前为止,我一直在使用 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)。因此,在用户输入不存在的主机 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!");
}
}
是的,我认为最干净的方法是使用 TcpClient.BeginConnect 方法。
因此,无论您是否可以连接到端点,您都会收到异步反馈。 另请参阅: Async Connect
您当前使用的构造函数重载方法也在连接,因此会阻塞您直到它连接。
此外,TcpClient
上没有属性来控制TcpClient
超时。
来自 MSDN:TcpClient(String, Int32)
Initializes a new instance of the TcpClient class and connects to the specified port on the specified host.
来自 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();
}
}
我知道的唯一方法是使用异步方法。 .Net 4.5 中有一个不错的新异步方法,它 returns 一个您可以像这样等待的任务:
tcpClient.ConnectAsync().Wait(timeout)
如果不成功,则 returns 为 false。