【问题标题】:UWP App stops receiving UDP Multicast messagesUWP 应用停止接收 UDP 多播消息
【发布时间】:2018-11-07 01:13:36
【问题描述】:

我目前遇到了一个非常奇怪的问题。我正在使用 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()

任何想法为什么? 谢谢你

【问题讨论】:

  • 通过咨询我的团队,我们担心您可能会遇到编译器问题。请尝试将统一编译器版本降低到Unity 2017.2.0f3 并再次测试。如果有效,我们将解释为什么您的问题作为回复。
  • 感谢您的快速回复。我通过使用 Unity 2017.4.2f2 运行我的应用程序 15 次来重现该错误,直到没有收到更多消息。然后我尝试用 Unity 2017.2.0f3 重新编译项目并重新运行应用程序,不幸的是,它没有改变任何东西。没有收到 UDP 消息,仍然需要重新启动

标签: c# unity3d uwp udp hololens


【解决方案1】:

不要将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();

【讨论】:

    猜你喜欢
    • 2012-06-05
    • 2019-05-12
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2016-05-24
    • 1970-01-01
    • 2018-02-27
    相关资源
    最近更新 更多