UWP DatagramsSocket发送UDP成功但MessageReceived未触发问题求助
问题分析与解决方案
你遇到的核心问题是调用ConnectAsync后,DatagramSocket会被关联到特定的远程端点(192.168.1.152:15999),只会接收来自这个端点的消息,但你的远程设备是从54697端口回复的,源端口和你连接的端口不一致,所以消息被过滤,MessageReceived事件不会触发。
另外还有个小细节:你用using包裹DatagramSocket虽然在当前代码里因为Task.Delay(5000)暂时不会释放,但如果后续逻辑调整,可能提前释放Socket导致收不到消息,不过这不是当前的主要问题。
解决方案:改用SendToAsync发送消息,避免关联固定远程端点
移除ConnectAsync调用,直接通过SendToAsync相关方式发送消息到远程设备的接收端口(15999),这样DatagramSocket不会被绑定到特定的远程端点,就能接收任何发往本地19000端口的UDP消息,包括远程设备从54697端口发来的回复。
修改后的代码如下:
async Task TestUdpIP() { DataWriter writer; // 若需长期监听,不要用using包裹,否则延迟结束后Socket会被释放 var udpClient = new DatagramSocket(); try { // 先注册消息接收事件,再绑定端点,避免错过绑定后立即收到的消息 udpClient.MessageReceived += UdpClient_MessageReceived; var localHostName = new Windows.Networking.HostName(controllerIpAddress.ToString()); // 绑定本地IP和端口,用于收发 await udpClient.BindEndpointAsync(localHostName, controllerIpPort.ToString()); string message = "Some message"; messagesReceived = 0; // 直接指定远程端点发送消息,不调用ConnectAsync var remoteHostName = new Windows.Networking.HostName(hostIpAddres.ToString()); var remoteEndpoint = new EndpointPair(localHostName, controllerIpPort.ToString(), remoteHostName, remoteHostPort.ToString()); writer = new DataWriter(udpClient.GetOutputStream(remoteEndpoint)); writer.WriteString(message); await writer.StoreAsync(); await writer.FlushAsync(); writer.Dispose(); // 及时释放资源 // 等待回复 await Task.Delay(5000); } catch (Exception ex) { // 添加异常处理,方便排查问题 Debug.WriteLine($"UDP Error: {ex.Message}"); } // 若无需长期监听,可在此释放Socket // udpClient.Dispose(); } void UdpClient_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) { messagesReceived++; // 可添加日志确认回复来源 Debug.WriteLine($"Received from {args.RemoteAddress}:{args.RemotePort}"); }
关键说明
- 移除
ConnectAsync:这个方法会让Socket进入“关联”状态,只接收来自指定远程端点(IP+端口)的消息,而你的设备回复用的是随机端口54697,和你连接的15999端口不匹配,所以收不到。 - 使用
EndpointPair发送:通过EndpointPair指定本地和远程端点发送消息,Socket不会被绑定到固定远程端点,能接收所有发往本地端口的消息。 - 权限与事件时机:你已经开启的
Internet(客户端)和Internet(客户端和服务器)权限是正确的;同时要确保在BindEndpointAsync之前注册MessageReceived事件,避免错过绑定后立即到达的消息。
内容的提问来源于stack exchange,提问作者Oreste Riccardo Natale
相关产品推荐
相关产品推荐

