2015-03-14 2 views
0

В моем приложении Xamarin.Android я отправляю широковещательное сообщение udp, чтобы найти мои серверы в локальной локальной сети. Мои серверы затем возвращают MachineName они бегут, на которых я отображать в ListView на мое приложение в видеUdp читает пустые байты после первого раза - mono android

<MachineName> - <Ip address>

Это все хорошо работает в первый раз, однако со второго раза на все это читает это пустые байты. Число прочитанных байтов правильное, но все они равны нулю.

Вот код:

private static void ListenForBroadcastResponses() 
{ 
    udp.BeginReceive(OnBroadcastResponse, new object()); 
} 

private static void OnBroadcastResponse(IAsyncResult ar) 
{ 
    // Recieve the message 
    IPEndPoint ip = new IPEndPoint(IPAddress.Any, port); 
    byte[] bytes = udp.EndReceive(ar, ref ip); 
    // Decode it 
    string message = Encoding.ASCII.GetString(bytes); 
    // If message is the awaited message from client or from the awaited port 
    if (ip.Port == port) //|| message == BRDCAST_ANSWER) 
    { 
     // Raise server found event 
     var handler = ServerFound; 
     if (handler != null) 
      handler(null, new ServerEventArgs 
      { 
       Server = new Server(message, ip.Address) 
      }); 
    } 

    // Start listening again 
    ListenForBroadcastResponses(); 
} 

Debug скриншоты:

Первый раз полные байты мь: First time

Второй раз и на байт пустуют: Second time and on

Что здесь не так?

ответ

0

В конце концов я понял. Это, кажется, ошибка вызвана несколькими потоками, пытаясь слушать одновременно (см this пост) в ответах, так что я вывешу мое решение:

  1. Я добавил RecieveTimeout от X секунды до UdpClient.
  2. По истечении времени я выполняю вызовы методов EndRecieve и Close.
  3. Это вызовет обратный вызов, переданный в BeginRecieve выполнить, поэтому я добавил проверку на метод обратного вызова, если клиент остается открытым if (udp.Client != null) ...

Он определил для меня вещи, так что надеюсь, это поможет другим

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