Как установить время ожидания TCP-соединения?
Я пытаюсь проверить соединение TCP со следующим кодом.
System.Threading.Thread t = new System.Threading.Thread(() =>
{
using (TcpClient client = new TcpClient())
{
client.Connect(ip, Convert.ToInt32(port));
}
});
t.Start();
Как установить тайм-аут, если IP или порт недействительны?
Ответы
Ответ 1
Нет встроенного способа сделать это. Я использую следующий код для многих наших приложений. Код отнюдь не оригинален, но работает нормально. Обратите внимание, что вам может потребоваться добавить повторы к этой функции... иногда она возвращает 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();
}
}
Ответ 2
Нет прямого способа его достижения, но одним из способов сделать это может быть отдельный метод, который будет проверять соединение.
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.
Ответ 3
Слишком поздно использовать 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
}