You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}");
}

关键说明

  1. 移除ConnectAsync:这个方法会让Socket进入“关联”状态,只接收来自指定远程端点(IP+端口)的消息,而你的设备回复用的是随机端口54697,和你连接的15999端口不匹配,所以收不到。
  2. 使用EndpointPair发送:通过EndpointPair指定本地和远程端点发送消息,Socket不会被绑定到固定远程端点,能接收所有发往本地端口的消息。
  3. 权限与事件时机:你已经开启的Internet(客户端)和Internet(客户端和服务器)权限是正确的;同时要确保在BindEndpointAsync之前注册MessageReceived事件,避免错过绑定后立即到达的消息。

内容的提问来源于stack exchange,提问作者Oreste Riccardo Natale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:47:28