Приложение UWP прекращает прием сообщений UDP Multicast - PullRequest
0 голосов
/ 28 мая 2018

У меня сейчас очень странная проблема.Я разрабатываю приложение для Microsoft HoloLens с Unity 2017.4.2f2.Проблема в том, что мой код работает хорошо, но HoloLens просто не получит больше UDP-сообщений от моего сервера python после нескольких запусков моего приложения.

Вот код для соединения DatagramSocket:

private HostName inetAddr;
private DatagramSocket sock;
private int inetPort;
private const int BUFFER_SIZE = 1024;
private byte[] buffer;

private async Task ConnectSocket()
{
    sock = new DatagramSocket();
    sock.MessageReceived += Socket_MessageReceived;
    sock.Control.MulticastOnly = true;
    sock.Control.InboundBufferSizeInBytes = BUFFER_SIZE;
    await sock.BindServiceNameAsync(inetPort.ToString());
    sock.JoinMulticastGroup(inetAddr);
    // Send empty message to initialize communication
    await SendWithExistingSocket("");
}

private async Task SendWithExistingSocket(string text)
{
    if (sock != null)
    {
        Stream stream = (await sock.GetOutputStreamAsync(inetAddr, inetPort.ToString())).AsStreamForWrite();
        using (var writer = new StreamWriter(stream))
        {
            writer.WriteLine(text);
            await writer.FlushAsync();
        }
    }
}

private async void Socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
    using (Stream streamIn = args.GetDataStream().AsStreamForRead(BUFFER_SIZE))
    {
        await streamIn.ReadAsync(buffer, 0, BUFFER_SIZE);
    }
    IPAddress address = IPAddress.Parse(inetAddr.RawName);
    IPEndPoint from = new IPEndPoint(address, int.Parse(sender.Information.LocalPort));
    //Custom function for dealing with packet
    HandlePacket(buffer, from);
}

Как я уже сказал, эта проблема очень странная, потому что этот код на самом деле работает, пока HoloLens просто не прекратит получать UDP-дейтаграммы (функция Socket_MessageReceived не вызывается) .В моем примере inetAddr = 224.3.0.5 и inetPort = 7667

Важно добавить, что мое приложение перезапускает получение UDP-сообщений после перезагрузки HoloLens с портала устройства .

У меня нет этой проблемы при развертывании приложения UWP на локальном компьютере.Только когда я развертываю свое приложение на HoloLens.У меня также есть реализация этого взаимодействия с классом UdpClient (для тестирования в редакторе), который работает очень хорошо и ведет себя не так.

Что я уже пробовал:

  • Проверка всех необходимых возможностей (Интернет-клиент и сервер, Клиент и сервер частной сети)
  • Изменение адреса многоадресной рассылки / порта прослушивания
  • Проверка сети с помощью WireShark (сообщения с сервера отправляются правильно)
  • Вызов socket.ispose () при выходе из приложения

Есть идеи почему?Спасибо

1 Ответ

0 голосов
/ 26 октября 2018

Не используйте Using со своим писателем и получателем, потому что это разрушит связь с вашими слушателями.У меня была эта проблема, и она сводила меня с ума, пока я не сделал это.Теперь он работает как шарм.

Я получаю пакеты, подобные этому:

bool refresh = false;
bool sound = false;
string response;
uint stringLength = args.GetDataReader().UnconsumedBufferLength;
response = args.GetDataReader().ReadString(stringLength);

, и пишу пакеты следующим образом:

IOutputStream outputStream;
HostName remoteHostname = new HostName("224.3.0.5");

outputStream = await socketinstance.GetOutputStreamAsync(remoteHostname, ClientPortNumber);

DataWriter writer = new DataWriter(outputStream);
writer.WriteString(request);
await writer.StoreAsync();
...