TcpClient как задать таймаут для установки соединения - C#
Формулировка задачи:
Добрый день
Возникла проблема.
При установке соединения с хостом на закрытый порт - поток висит 23 секунды и ждёт ответа от удаленного хоста.
(отправляет SYN , после чего ждет SYN ACK целых 23 секунды!)
как задать это время таймаута?
чтобы было не 23 секунды а хотя бы 1 секунда ?
есть какие-то может другие способы ?
нужно проверить быстро доступность порта.
через несколько потоков не пойдет. так как хостов много
Благодарю за помощь
источник http://stackoverflow.com/questions/1...onnect-timeout
try
{
TcpClient tcp = new TcpClient();
int port = 80;
IPAddress addr = IPAddress.Parse(currentIP);
tcp.SendTimeout = 1000;
tcp.ReceiveTimeout = 1000;
tcp.Connect(addr, port);
openPort80 = true;
tcp.Close();
//MessageBox.Show("TCP Connected!");
}
catch (SocketException sockEx)
{
openPort80 = false;
//MessageBox.Show("Ошибка\n" + "Сообщение=" + sockEx.Message);
}
catch
{
}
нашел решение - если понадобиться кому-то:
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Connect using a timeout (5 seconds)
IAsyncResult result = socket.BeginConnect( sIP, iPort, null, null );
bool success = result.AsyncWaitHandle.WaitOne( 5000, true );
if ( !success )
{
// NOTE, MUST CLOSE THE SOCKET
socket.Close();
throw new ApplicationException("Failed to connect server.");
}
// Success
//...Решение задачи: «TcpClient как задать таймаут для установки соединения»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
IPAddress address = IPAddress.Parse("192.168.0.100");
int port = 8010;
int timeout = 2000;
try {
new TcpClientEx().Connect(address, port, timeout);
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
public class TcpClientEx : TcpClient {
public void Connect(IPAddress address, int port, int timeout) {
var result = base.Client.BeginConnect(address, port, null, null);
while (!result.AsyncWaitHandle.WaitOne(timeout, true)) {
base.Client.Dispose();
throw new Exception("Timeout error!");
}
}
}
}