Когда Клиент пытается подключиться к отключенному IP-адресу, возникает длительный тайм-аут более 15 секунд ... Как мы можем уменьшить этот таймаут? Как это можно настроить?
Код, который я использую для установки сокет-соединения, следующий:
try
{
m_clientSocket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(serverIp);
int iPortNo = System.Convert.ToInt16(serverPort);
IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);
m_clientSocket.Connect(ipEnd);
if (m_clientSocket.Connected)
{
lb_connectStatus.Text = "Connection Established";
WaitForServerData();
}
}
catch (SocketException se)
{
lb_connectStatus.Text = "Connection Failed";
MessageBox.Show(se.Message);
}
null
в дляcallback
и вы планируетеEndConnect()
, если сокет былclosed
тогда это даст вам исключение. Так что не забудьте проверить ...AsyncWaitHandle.WaitOne
будет сигнализироваться, но сокет останется неподключенным.Мое мнение:
источник
SocketExtension
, вы все еще не использовали,.Connected
чтобы проверить, есть ли у вас, и вы не используетеsocket.Connected = true;
для определенияsuccess
.Я просто написал класс расширения, чтобы разрешить тайм-ауты в соединениях. Используйте его точно так же, как и стандартные
Connect()
методы, с дополнительным параметром с именемtimeout
.источник
socket.EndConnect
закрытия требуется ~ 10 секунд, поэтому функция возвращается не по прошествии заданного промежутка времени, а по прошествии промежутка времени + времяЯ не программирую на C #, но на C мы решаем ту же проблему, делая сокет неблокирующим, а затем помещая fd в цикл выбора / опроса со значением тайм-аута, равным времени, в течение которого мы готовы ждать подключения. преуспеть.
Я нашел это для Visual C ++, и объяснение там также склоняется к механизму выбора / опроса, который я объяснял ранее.
По моему опыту, вы не можете изменить значения таймаута подключения для каждого сокета. Вы меняете его для всех (настраивая параметры ОС).
источник
может быть уже слишком поздно, но есть отличное решение на основе Task.WaitAny (c # 5 +):
источник
Я решил проблему, используя метод Socket.ConnectAsync вместо метода Socket.Connect. После вызова Socket.ConnectAsync (SocketAsyncEventArgs) запустите таймер (timer_connection), если время истекло, проверьте, подключено ли соединение с сокетом (если (m_clientSocket.Connected)), если нет, появится ошибка тайм-аута.
источник
Проверьте это на MSDN . Не похоже, что вы можете сделать это с помощью реализованных свойств в классе Socket.
Плакат на MSDN фактически решил свою проблему с помощью потоковой передачи. У него был основной поток, который вызывал другие потоки, которые запускали код соединения в течение пары секунд, а затем проверяли свойство Connected сокета:
Что вы пытаетесь сделать, и почему он не может подождать 15-30 секунд до истечения времени ожидания?
источник
У меня была такая же проблема при подключении к сокету, и я придумал следующее решение: оно отлично работает для меня. `
источник
Я работал с Unity, и у меня были проблемы с BeginConnect и другими асинхронными методами из сокета.
Я кое-что не понимаю, но предыдущие примеры кода мне не подходят.
Итак, я написал этот фрагмент кода, чтобы он работал. Я тестирую его в специальной сети с Android и ПК, а также локально на моем компьютере. Надеюсь, это поможет.
и есть очень простой сторожевой таймер на C #, чтобы заставить его работать:
источник
Это похоже на ответ FlappySock, но я добавил к нему обратный вызов, потому что мне не понравился макет и то, как возвращалось логическое значение. В комментариях к этому ответу Ника Миллера:
Поэтому мне кажется, что полагаться на то, что возвращается, может быть опасно - я предпочитаю использовать
socket.Connected
. Я устанавливаю логическое значение, допускающее значение NULL, и обновляю его в функции обратного вызова. Я также обнаружил, что он не всегда завершает отчет о результате, прежде чем вернуться к основной функции - я тоже обрабатываю это и заставляю его ждать результата, используя тайм-аут:По теме: Как проверить, подключен ли я?
источник
В классе Socket должно быть свойство ReceiveTimeout.
Socket.ReceiveTimeout Свойство
источник
ReceiveTimeout
- это строго при получении с помощьюBeginReceive
иEndReceive
. Нет эквивалента, когда вы просто видите, подключены ли вы.