2013-05-14 2 views
0

Я использую 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 при возникновении этого таймаута; Я надеюсь на альтернативу или любые другие предложения.

+0

Правильно ли я понимаю? Вы хотите, чтобы пользователь мог отключить свою сетевую карту? Если бы я правильно понял, что вы ожидаете от этого? Вы написали, что хотите воссоздать/привязать UdpClient, но как это обойтись без включенной сетевой карты? –

+0

@ Сетевая карта @JanDoerrenhaus не является проблемой. Я думаю, проблема заключается в том, что ни один пакет не отправляется по запросу закрытого соединения в отличие от TCP (SYN, ACK и т. Д.)? Лучше всего, наверное, поймать SocketException и использовать предоставленный ErrorCode –

+0

@LewsTherin «Затем пользователь отключает сетевой интерфейс в системе». Это очень похоже на меня, как на сетевую карту. –

ответ

0

UDP полностью без гражданства. Эмпирическое правило: вы не можете полагаться ни на что. Не при отправке, а не при получении, а не при получении ошибок, когда что-то пойдет не так.

UDP тихо садится и ждет следующего пакета. Связывая его с конечной точкой, вы просто говорите ему, чтобы отбросить все, что явно не отправлено на эту конечную точку. Поэтому, если пользователь отключает свою сетевую карту, он все еще ждет пакетов, которые были отправлены на связанный конечный пункт, даже если это стало невозможным для пакетов. И как только вы снова активируете карту, и кто-то отправит ее на эту конечную точку, клиент UDP получит ее, как будто ничего не произошло.

Краткая история: ваш UdpClient не является выбором программного обеспечения для выяснения, была ли отключена сетевая карта. Вам нужно будет найти другой способ и отключить ваш UdpClient вручную, если вы действительно хотите обработать этот случай. Например, вы можете инициализировать TCP на другом порту. Я вполне уверен, что на самом деле это приведет к ошибке, если вы отключите сетевую карту.

 Смежные вопросы

  • Нет связанных вопросов^_^