Я использую UdpClient, привязанный к предоставленной конечной точке, для прослушивания входящих пакетов. Мой код выглядит следующим образом:Как я могу обработать, когда UdpClient прослушивает адрес, который больше не доступен?
...
string myIpAddress = "192.168.1.100";
int myPort = 50000;
IPEndPoint selfEndPoint = new IPEndPoint(IPAddress.Parse(myIpAddress), myPort);
IPEndPoint anySourceEndPoint = new IPEndPoint(IPAddress.Any, 0);
UdpClient receivingClient = new UdpClient();
receivingClient.Client.Bind(selfEndPoint); // Can throw.
receivingClient.Receive(ref anySourceEndPoint);
...
Если интерфейс с IP-адресом «192.168.1.100» не существует, он бросает SocketException` (как и ожидалось). В этом случае существует такой интерфейс, UdpClient успешно связывается и ожидает входящего пакета. Моя проблема заключается в следующем.
Как определить, где я блокирую Receive
, и адрес интерфейса больше не доступен?
Например, приложение работает и ожидает входящих пакетов. Затем пользователь отключает сетевой интерфейс в системе. Приложение по-прежнему предполагает, что оно может принимать пакеты, даже если это невозможно.
Закрытие, на которое я пришел, устанавливает на клиенте ReceiveTimeout
и воссоздает/связывает UdpClient при возникновении этого таймаута; Я надеюсь на альтернативу или любые другие предложения.
Правильно ли я понимаю? Вы хотите, чтобы пользователь мог отключить свою сетевую карту? Если бы я правильно понял, что вы ожидаете от этого? Вы написали, что хотите воссоздать/привязать UdpClient, но как это обойтись без включенной сетевой карты? –
@ Сетевая карта @JanDoerrenhaus не является проблемой. Я думаю, проблема заключается в том, что ни один пакет не отправляется по запросу закрытого соединения в отличие от TCP (SYN, ACK и т. Д.)? Лучше всего, наверное, поймать SocketException и использовать предоставленный ErrorCode –
@LewsTherin «Затем пользователь отключает сетевой интерфейс в системе». Это очень похоже на меня, как на сетевую карту. –