[英]How to set test TCP connection timeout?
我尝试使用以下代码测试TCP连接。
System.Threading.Thread t = new System.Threading.Thread(() =>
{
using (TcpClient client = new TcpClient())
{
client.Connect(ip, Convert.ToInt32(port));
}
});
t.Start();
如果IP或端口无效,如何设置超时时间?
没有内置的方法可以做到这一点。 我将以下代码用于我们的许多应用程序。 该代码绝不是原始代码,但可以。 请注意,您可能必须向此功能添加重试...有时即使服务器已启动并正在运行,它也会返回false。
private static bool _TryPing(string strIpAddress, int intPort, int nTimeoutMsec)
{
Socket socket = null;
try
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, false);
IAsyncResult result = socket.BeginConnect(strIpAddress, intPort, null, null);
bool success = result.AsyncWaitHandle.WaitOne(nTimeoutMsec, true);
return socket.Connected;
}
catch
{
return false;
}
finally
{
if (null != socket)
socket.Close();
}
}
没有直接的方法来实现它,但是一种实现方法可以是使用单独的方法来测试连接。
static bool TestConnection(string ipAddress, int Port, TimeSpan waitTimeSpan)
{
using (TcpClient tcpClient = new TcpClient())
{
IAsyncResult result = tcpClient.BeginConnect(ipAddress, Port, null, null);
WaitHandle timeoutHandler = result.AsyncWaitHandle;
try
{
if (!result.AsyncWaitHandle.WaitOne(waitTimeSpan, false))
{
tcpClient.Close();
return false;
}
tcpClient.EndConnect(result);
}
catch (Exception ex)
{
return false;
}
finally
{
timeoutHandler.Close();
}
return true;
}
}
此方法将使用WaitHandle,它将等待指定的时间段以建立连接,如果及时建立连接,它将关闭连接并返回true,否则将超时并返回false。
对于OP来说太晚了,但是对于仍然可以通过搜索找到该页面的任何人,您都可以使用.Net 4.5中引入的异步编程功能来解决。
var hostname = "127.0.0.1";
var port = 123;
var timeout = TimeSpan.FromSeconds(3);
var client = new TcpClient();
if (!client.ConnectAsync(hostname, port).Wait(timeout))
{
// timed out
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.