簡體   English   中英

UWP App停止接收UDP組播消息

[英]UWP App stops receiving UDP Multicast messages

我目前遇到一個非常奇怪的問題。 我正在使用Unity 2017.4.2f2為Microsoft HoloLens開發應用程序。 問題是我的代碼運行良好,但是在我的應用運行幾次后,HoloLens不會再從python服務器接收到更多的UDP消息。

這是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

重要的是要在從設備門戶重新啟動HoloLens之后 ,我的應用程序重新開始接收UDP消息。

在本地計算機上部署UWP應用程序時,我沒有這個問題。 僅在將我的應用程序部署到HoloLens時。 我還使用UdpClient類(用於在編輯器中進行測試)實現了這種通信的實現,該類工作得很好,並且行為並非如此。

我已經嘗試過的

  • 檢查必要的功能(Internet客戶端和服務器,專用網絡客戶端和服務器)
  • 更改多播地址/監聽端口
  • 使用WireShark檢查網絡(來自服務器的消息已正確發送)
  • 退出應用程序時調用socket.Dispose()

有什么想法嗎? 謝謝

不要與作家和接收者一起使用“ 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM