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

如何用.NET ClientWebSocket类测量延迟?无服务器代码访问权限

用.NET ClientWebSocket测量延迟的可行方案

由于ClientWebSocket默认会自动处理Ping/Pong帧(符合RFC 6455标准),但并未暴露拦截Pong响应的API,要实现延迟测量,需要绕开自动处理逻辑,手动控制Ping/Pong的发送与监听。

核心思路

.NET的ClientWebSocket底层依赖WebSocket抽象类,自动Ping/Pong由内部的WebSocketHandle处理。要手动计算延迟,必须禁用自动Ping/Pong,然后自行发送Ping帧并监听对应的Pong响应,通过时间戳差计算延迟。

具体实现步骤

  1. 禁用自动Ping/Pong
    通过反射修改ClientWebSocket内部配置,将保活间隔设为0,关闭自动Ping逻辑:

    var client = new ClientWebSocket();
    // 反射获取内部配置并禁用自动保活
    var optionsField = typeof(ClientWebSocket).GetField("_options", BindingFlags.NonPublic | BindingFlags.Instance);
    if (optionsField != null)
    {
        var options = optionsField.GetValue(client) as WebSocketOptions;
        options?.KeepAliveInterval = TimeSpan.Zero;
    }
    
  2. 手动发送Ping帧并记录时间戳
    发送Ping时携带唯一标识(比如UTC时间戳的字节数组),同时记录发送时刻:

    var pingBuffer = BitConverter.GetBytes(DateTime.UtcNow.Ticks);
    await client.SendAsync(new ArraySegment<byte>(pingBuffer), WebSocketMessageType.Ping, true, CancellationToken.None);
    var sendTime = DateTime.UtcNow;
    
  3. 监听Pong帧计算延迟
    在接收循环中判断帧类型,收到Pong时解析携带的时间戳,计算往返延迟:

    var buffer = new byte[1024];
    while (client.State == WebSocketState.Open)
    {
        var result = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        if (result.MessageType == WebSocketMessageType.Pong)
        {
            var receiveTime = DateTime.UtcNow;
            var sentTicks = BitConverter.ToInt64(buffer, 0);
            var sentTime = new DateTime(sentTicks, DateTimeKind.Utc);
            var latency = receiveTime - sentTime;
            // 自行处理延迟结果,比如记录或展示
            Console.WriteLine($"当前延迟: {latency.TotalMilliseconds:F2}ms");
        }
        // 处理业务相关的文本/二进制帧
        else if (result.MessageType is WebSocketMessageType.Text or WebSocketMessageType.Binary)
        {
            // 正常业务逻辑处理
        }
    }
    

注意事项

  • 反射操作可能随.NET版本更新失效,需针对目标版本测试验证。
  • 确保服务器遵循RFC 6455,会将Ping帧的payload原封不动返回在Pong帧中,否则无法解析时间戳。
  • 控制Ping发送频率,避免给服务器造成不必要的负载(比如每10秒发送一次)。

内容的提问来源于stack exchange,提问作者sebas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:27:33