TcpClient как задать таймаут для установки соединения - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день Возникла проблема. При установке соединения с хостом на закрытый порт - поток висит 23 секунды и ждёт ответа от удаленного хоста. (отправляет SYN , после чего ждет SYN ACK целых 23 секунды!) как задать это время таймаута? чтобы было не 23 секунды а хотя бы 1 секунда ? есть какие-то может другие способы ? нужно проверить быстро доступность порта. через несколько потоков не пойдет. так как хостов много Благодарю за помощь
Листинг программы
  1. try
  2. {
  3. TcpClient tcp = new TcpClient();
  4. int port = 80;
  5. IPAddress addr = IPAddress.Parse(currentIP);
  6. tcp.SendTimeout = 1000;
  7. tcp.ReceiveTimeout = 1000;
  8. tcp.Connect(addr, port);
  9. openPort80 = true;
  10. tcp.Close();
  11. //MessageBox.Show("TCP Connected!");
  12. }
  13. catch (SocketException sockEx)
  14. {
  15. openPort80 = false;
  16. //MessageBox.Show("Ошибка\n" + "Сообщение=" + sockEx.Message);
  17. }
  18. catch
  19. {
  20. }
нашел решение - если понадобиться кому-то:
Листинг программы
  1. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  2. // Connect using a timeout (5 seconds)
  3. IAsyncResult result = socket.BeginConnect( sIP, iPort, null, null );
  4. bool success = result.AsyncWaitHandle.WaitOne( 5000, true );
  5. if ( !success )
  6. {
  7. // NOTE, MUST CLOSE THE SOCKET
  8. socket.Close();
  9. throw new ApplicationException("Failed to connect server.");
  10. }
  11. // Success
  12. //...
источник http://stackoverflow.com/questions/1...onnect-timeout

Решение задачи: «TcpClient как задать таймаут для установки соединения»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net;
  6. using System.Net.Sockets;
  7.  
  8. namespace ConsoleApplication1 {
  9.     class Program {
  10.         static void Main(string[] args) {
  11.             IPAddress address = IPAddress.Parse("192.168.0.100");
  12.             int port = 8010;
  13.             int timeout = 2000;
  14.             try {
  15.                 new TcpClientEx().Connect(address, port, timeout);
  16.             }
  17.             catch (Exception ex) {
  18.                 Console.WriteLine(ex.Message);
  19.             }
  20.             Console.ReadLine();
  21.         }
  22.     }
  23.     public class TcpClientEx : TcpClient {
  24.         public void Connect(IPAddress address, int port, int timeout) {
  25.             var result = base.Client.BeginConnect(address, port, null, null);
  26.             while (!result.AsyncWaitHandle.WaitOne(timeout, true)) {
  27.                 base.Client.Dispose();
  28.                 throw new Exception("Timeout error!");
  29.             }
  30.         }
  31.     }
  32. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.333 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы