C# QUIC协议监听器方法 C#如何使用QuicListener实现基于QUIC的通信

1次阅读

.net 8 中不存在 quiclistener 类,官方仅提供 quic 客户端支持(quicconnection/quicstream),无服务端监听器实现;裸 quic 服务端需绕过 .net 直接调用 msquic 或等待未来官方支持。

C# QUIC协议监听器方法 C#如何使用QuicListener实现基于QUIC的通信

QuicListener 在 .NET 中并不存在

截至 .NET 8(2023 年底最新稳定版),QuicListener 类**并未被官方引入**。.NET 的 System.Net.Quic 命名空间只提供了客户端能力,即 QuicConnectionQuicStream,用于发起 QUIC 连接和收发数据;但**没有服务端监听器实现**,也没有 QuicListenerQuicServer 或类似类型。

这意味着你无法像用 httpListenerTcpListener 那样直接 new 一个监听器并 Start() —— 这个类目前纯属不存在,不是隐藏、不是预览、也不是命名不同,而是根本未实现。

.NET 官方 QUIC 支持现状:仅客户端,且需 windows 11 / Server 2022 + MsQuic

.NET 的 QUIC 支持依赖系统底层的 MsQuic 库,而该库的服务端功能在 .NET 运行时中尚未封装暴露。即使你手动调用 MsQuic 的 C API 实现监听逻辑,.NET 也未提供配套的托管抽象(如 QuicServer 派生类或回调绑定机制)。

当前可确认的事实包括:

  • QuicConnection 只能调用 ConnectAsync(),不能调用 AcceptConnectionAsync()
  • QuicListener 不在任何 .NET SDK 的程序集(如 System.Net.Quic.dll)中导出
  • 搜索 dotnet/runtime github 仓库,可见大量关于“server-side QUIC”的 open issue(如 issue #62297),但均标记为 “future” 或 “unplanned”
  • Windows 上可用 msquic.dll 自行实现服务端,但需 P/Invoke + 手动生命周期管理,无 .NET 流式 API 支持

替代方案:用 Kestrel + HTTP/3(隐式 QUIC)承载 Web API

如果你实际目标是“跑在 QUIC 上的 HTTP 服务”,而非裸 QUIC 流通信,那么正确路径是启用 Kestrel 的 HTTP/3 支持 —— 它底层自动使用 MsQuic,并为你屏蔽连接监听与 TLS 握手细节。

关键操作如下:

  • 确保操作系统为 Windows 11 22H2+ 或 Windows Server 2022,且已安装 msquic(通常随系统更新自带)
  • 项目 SDK 设为 <targetframework>net8.0</targetframework> 或更高
  • Program.cs 中启用 HTTP/3:
var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel(serverOptions => {     serverOptions.ListenAnyIP(5001, listenOptions =>     {         listenOptions.Usehttps(); // 必须 HTTPS         listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;     }); });

启动后,Kestrel 会同时监听 TCP(HTTP/1.1+HTTP/2)和 udp(HTTP/3/QUIC)端口。浏览器访问 https://localhost:5001 时,若支持 HTTP/3 就会自动走 QUIC。

想做裸 QUIC 服务?目前只能绕过 .NET,直连 MsQuic

若你确实需要自定义协议、非 HTTP 场景下的 QUIC 服务端(例如游戏状态同步、iot 数据通道),.NET 当前不提供可行路径。可行但高成本的选择只有:

  • 用 C/c++ 编写基于 MsQuic 的服务端,通过命名管道、本地 socket 或 gRPC 与 C# 进程通信
  • 使用第三方跨平台 QUIC 库(如 neqorust)、quiche(Rust/C)),再通过 P/Invoke 或进程间方式桥接
  • 等待 .NET 官方明确路线图(目前无时间表)——不要依赖未发布的预览包或社区魔改版,它们稳定性与兼容性无保障

特别注意:网上部分博客提到的“QuicListener 示例代码”,基本都出自错误理解、拼写混淆(比如把 UdpClientHttpListener 示例误标为 QUIC),或引用了早已废弃的早期 CoreFX 实验分支。

text=ZqhQzanResources