Недопустимое время закрытия IP-штекера в ОС Windows

Эти коды обеспечивают отправку данных через User Datagram Protocol. Ниже приведены два кода. Когда я использую первый код для недоступного адреса Ip, я получил трехсекундную задержку.


Посмотреть новые результаты


JUST OPEN NEW C # CONSOLE APP И ВСТАВЬТЕ ЭТИ КОДЫ В ЭТО. (ПЕРВЫЙ КОД)

using System; using System.Net; using System.Net.Sockets; namespace Test { class Program { static void Main(string[] args) { byte[] data = { 1, 20, 60, 44, 244 }; while (true) { Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt")); try { using (var client = new UdpClient()) { // Please check IP Address, It must be unreachable... // IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.1.141"), 55600); // client.Connect(ep); client.Send(data, data.Length, "192.168.1.141" , 55600); } Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt")); Console.WriteLine(" "); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } } } 

Тест 1 (с использованием) : Доступный IP-адрес
Тест 2 (с использованием) : недоступный IP-адрес
Вывод:
Test1 label1 —> h: mm: ss label2 —> h: mm: ss (Same Time)
Test2 label1 —> h: mm: ss label2 —> h: mm: ss +3 second
(Без исключения)

Результаты WireShark:
Тест 1 (с использованием) : Достижимый Ip -> Данные пойманы, видны.
Тест 2 (с использованием) : недоступный IP-> Нет данных.

Когда я использую без «использования» блоков, я не получил трехсекундную задержку.

JUST OPEN NEW C # CONSOLE APP И ВСТАВЬТЕ ЭТИ КОДЫ В ЭТО. (ВТОРОЙ КОД)

 using System; using System.Net; using System.Net.Sockets; namespace Test { class Program { static void Main(string[] args) { byte[] data = { 1, 20, 60, 44, 244 }; while (true) { Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt")); try { var client = new UdpClient(); //Please check IP address, It must be unreachable... // IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.1.41"), 5600); // client.Connect(ep); client.Send(data, data.Length, "192.168.1.141", 55600); Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt")); } catch (Exception xe) { Console.WriteLine(xe.ToString()); } Console.WriteLine(" "); System.Threading.Thread.Sleep(1000); } } } } 

Тест 1 (без использования) : Досягаемый Ip
Тест 2 (без использования) : недоступный Ip

Вывод:
Test1 label1 —> h: mm: ss (Same Time) label2 —> h: mm: ss (Same Time)
Test2 label1 —> h: mm: ss (Same Time) label2 —> h: mm: ss (Same Time)
(Без исключения)

Результаты WireShark:
Тест 1 (без использования) : Достижимый Ip -> Данные пойманы, видны.
Тест 2 (без использования) : недоступный IP-> Нет данных.

Каково среднее значение этой трехсекундной задержки?
Я не уверен, но я думаю, что мне нужно использовать «использование» блоков, потому что, если бы я не использовал использование памяти блоков, это увеличивало бы очень высокий уровень. В чем разница между обоими кодами? Какой из них более надежный? Есть ли лучший способ? Мне не нужна трехсекундная задержка.

Как уменьшить трехсекундную задержку до нуля?

Заранее спасибо…


НОВЫЕ РЕЗУЛЬТАТЫ

Я попробовал сокет Close / Dispose для недостижимого IP с языком программирования Python в ОС Windows. Я получил тот же результат, а именно трехсекундную задержку для недоступного IP-адреса. Но когда я пытаюсь использовать один и тот же код Python в Ubuntu 15.10, я не получил трехсекундную задержку.

 import socket import datetime IPADDR = '192.168.1.141' PORTNUM = 5600 PACKETDATA = "f1a525da11f6".encode() while(True): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0) s.connect((IPADDR, PORTNUM)) s.send(PACKETDATA) print(datetime.datetime.now()) s.close() в import socket import datetime IPADDR = '192.168.1.141' PORTNUM = 5600 PACKETDATA = "f1a525da11f6".encode() while(True): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0) s.connect((IPADDR, PORTNUM)) s.send(PACKETDATA) print(datetime.datetime.now()) s.close() 

3 Solutions collect form web for “Недопустимое время закрытия IP-штекера в ОС Windows”

Ваш UdpClient является одноразовым объектом. Вы должны утилизировать его, прежде чем снова подключиться.

  using (var client = new UdpClient()){ //Please check IP address, It must be unreachable... IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.1.41"), 5600); client.Connect(ep); client.Send(data, data.Length); } 

или переместите соединение за пределы вашего цикла, чтобы повторно использовать одно и то же соединение.

Фактическая разница заключается в том, что метод Dispose() не вызывается на client в SECODD CODE. Но Dispose() вызывается в FIRST CODE с using (var client = new UdpClient()) . Метод Dispose() занимает 3 секунды дополнительного времени при вызове после попытки подключения недостижимых IP-адресов.

Вы можете SECOND CODE, как показано ниже, чтобы заметить задержку печати последней метки. Задержка вызвана Dispose . client должен быть объявлен над блоком try, чтобы использовать его в блоке finally .

 finally { if (client != null) ((IDisposable)client).Dispose(); } Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt")); 

Я также заметил, что задержка не вызвана, если недоступен IP-адрес вне домена. Например, если IP-адрес моего компьютера равен 192.168.1.20 и я пытаюсь получить доступ к 202.22.1.88 то задержка не будет видна.

Вывод: задержка вызвана Dispose() . Но поведение Dispose() должно быть дополнительно исследовано.

Уменьшить трехсекундную задержку до нуля. Решение 1 (Использование с ThreadPool):


 while (true) { Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt")); try { ThreadPool.QueueUserWorkItem(state => { using (var client = new UdpClient()) { client.Send(data, data.Length, "192.168.1.145", 55600); } }); Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt")); Console.WriteLine(" "); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } System.Threading.Thread.Sleep(1000); // to see easily } 

Уменьшить трехсекундную задержку до нуля. Решение 1 (клиент = null):


 while (true) { Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt")); try { var client = new UdpClient(); client.Send(data, data.Length, "192.168.1.145", 55600); client = null; Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt")); Console.WriteLine(" "); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } System.Threading.Thread.Sleep(1000); // to see easily } 
  • Передача и получение массивов через Sockets
  • Получение программы сокета UDP в Python для приема сообщений от клиента Syslog?
  • Python UDP-сокет полу-случайным образом не получает
  • Python - обнаружение, если удаленный компьютер включен
  • Python UDP Broadcast не отправляет
  • Получение пакетов широковещания в Python
  • UDP-клиент и сервер с Twisted Python
  • Получение многоадресных UDP-дейтаграмм с помощью python в Linux
  • Python raw сокет, прослушивающий пакеты UDP; только половина полученных пакетов
  • Скрученный UDP к TCP-мосту
  • Живой видеопоток на сервере (ПК) из изображений, отправленных роботом через UDP
  • Python - лучший язык программирования в мире.