Windows 服务中未调用 UDP 侦听器回调

问题描述

我有一个 Windows 服务。作为初始化的一部分,它调用此 StartListener 方法,该方法打开一个 UDP 端口以进行侦听。我可以通过 netstat 确认端口正在侦听。但是当我发送消息时,回调永远不会触发。

        //Called by service on start
        public static void StartListener(int port)
        {
            if (udpClient != null)
            {
                udpClient.Close();
                udpClient = null;
            }
            try
            {
                udpClient = new UdpClient(31050);
                udpClient.BeginReceive(new AsyncCallback(recv),null);
                ControlService.log.WriteEntry("Listening on port " + port);
            }
            catch (Exception e)
            {
                ControlService.log.WriteEntry(e.Message);
            }
        }

        public static void recv(IAsyncResult res)
        {
            ControlService.log.WriteEntry("UDP Callback");
            //do actual things
        }

        //From other app
        public void SendBytes(byte[] bytes,IPEndPoint RemoteIpEndPoint)
        {
            try
            {
                udpClient.Send(bytes,bytes.Length,RemoteIpEndPoint);
            }
            catch { ... }
        }

我正在从一个统一应用程序移植它,该应用程序调用相同的 StartListener 方法,该方法确实有效。两种情况下的调用应用程序相同。

我是否遗漏了 Windows 服务可能需要的某些东西?

解决方法

这不是一个完整的答案,但希望能帮助其他有类似问题的人。

问题似乎是发件人是一个统一的应用程序。当我将一个发送 UDP 消息的快速 c# 应用程序放在一起时,它会被服务接收。出于同样的原因,当我使用该应用程序向旧的 Unity 接收器发送消息时,它不会通过。我的猜测是 Unity 在幕后做了一些事情,在正常的 UdpClient 行为之外包装/解包消息。