UDP - отправка многоадресного сообщения и прослушивание ответа дает SocketException - PullRequest
3 голосов
/ 07 июня 2011

Я отправляю многоадресное UDP-сообщение, чтобы найти определенные устройства в сети.Затем я прослушиваю ответ на порт 5001.

Мой рабочий процесс выглядит следующим образом:

  1. Отправка многоадресного сообщения "поиск" в локальную подсеть.
  2. Любой wiznet устройства в сети отвечают информационным пакетом, который я хочу получить

Все это прекрасно работает в Windows XP, но в Windows 7 я получаю исключениетипа SocketException: *

Обычно разрешено только одно использование каждого адреса сокета (протокола / сетевого адреса / порта)

Я вижу, что многоадресное сообщение выходит в Wireshark , и я вижу ответ от устройства (устройств), но мой код не отвечает.Мой код выглядит так:

  public void StartListen()
  {
      SendFind();
      try {
          IPEndPoint localEp = new IPEndPoint(IPAddress.Any, 0);
          UdpClient listenClient = new UdpClient(5001);

          UdpState s = new UdpState();
          s.endpoint = localEp;
          s.client = listenClient;

          //allow time for the find to work - aka clutching at straws
          Thread.Sleep(500);

          while (listenClient.Available > 0)
          {
              listenClient.BeginReceive(ReceiveCallback, s);
              Thread.Sleep(500);
          }
      }

      catch (SocketException e)
      {
          Trace.WriteLine("Could not bind to socket on " + _localPort);
      }

      listenClient.Close();
  }

.. и RecieveCallBack ..

private void ReceiveCallback(IAsyncResult ar)
{
    UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).client;
    IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).endpoint;
    Byte[] receiveBytes = u.EndReceive(ar, ref e);
    rxByteList.Add(receiveBytes);
    messageRxed = true;
}

** ОБНОВЛЕНИЕ **

Итак, я попробовал различные способы структурирования этогокод.Кажется, что проблема связана с отправкой и получением на разных UdpClients.Мое исключение было вызвано созданием UdpClient для получения сразу после открытия одного для отправки - добавление задержки между отправкой и получением исправило это.

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

1 Ответ

2 голосов
/ 07 июня 2011

Сортировка!Это произошло потому, что мой Sendpacket использовал «udpclient.connect», который ограничивает получение всеми данными в конечной точке, предоставленными для метода connect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...