问题描述
我有一个 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 行为之外包装/解包消息。