.net 8 使用 quic 协议通讯

debian环境安装 quic支持

# 1. 添加unstable仓库(如果您使用的是Debian的不稳定分支)
sudo apt install apt-transport-https ca-certificates
sudo wget -O /etc/apt/trusted.gpg.d/microsoft.gpg https://packages.microsoft.com/keys/microsoft.asc
echo "deb [arch=amd64] https://packages.microsoft.com/debian/$(lsb_release -cs) prod-unstable main" | \sudo tee /etc/apt/sources.list.d/msprod.list# 2. 更新包列表
sudo apt update# 3. 安装libmsquic
sudo apt install libmsquic

window环境要求

要求Windows 11、Windows Server 2022 或更新版本

代码

using System.Net.Quic;
using System.Net.Security;
using System.Net;
using System.Runtime.Versioning;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography;
using System.Buffers;
using System.Reflection.PortableExecutable;
using System.IO.Pipelines;
using System.Text;namespace ConsoleApp1
{internal class Program{[SupportedOSPlatform("linux")][SupportedOSPlatform("windows")][RequiresPreviewFeatures]static async Task Main(string[] args){// 创建 QuicListenervar listener = await QuicListener.ListenAsync(new QuicListenerOptions{ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http3 },ListenEndPoint = new IPEndPoint(IPAddress.Loopback, 9999),ConnectionOptionsCallback = (connection, ssl, token) => ValueTask.FromResult(new QuicServerConnectionOptions(){DefaultStreamErrorCode = 0,DefaultCloseErrorCode = 0,ServerAuthenticationOptions = new SslServerAuthenticationOptions(){ApplicationProtocols = new List<SslApplicationProtocol>() { SslApplicationProtocol.Http3 },ServerCertificate = GenerateManualCertificate()//生成证书}})});_ = Task.Run(async () =>{Console.WriteLine("Quic Client Running...");await Task.Delay(1000);// 连接到服务端var connection = await QuicConnection.ConnectAsync(new QuicClientConnectionOptions{DefaultCloseErrorCode = 0,DefaultStreamErrorCode = 0,RemoteEndPoint = new IPEndPoint(IPAddress.Loopback, 9999),ClientAuthenticationOptions = new SslClientAuthenticationOptions{ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http3 },RemoteCertificateValidationCallback = (sender, certificate, chain, errors) =>{return true;}}});// 打开一个出站的双向流var stream = await connection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);stream.ReadTimeout = 16000;var reader = PipeReader.Create(stream);var writer = PipeWriter.Create(stream);// 后台读取流数据_ = ProcessLinesAsync(stream);Console.WriteLine();// 写入数据for (int i = 0; i < 7; i++){await Task.Delay(2000);var message = $"Hello Quic {i} \n";Console.Write("Send -> " + message);await writer.WriteAsync(Encoding.UTF8.GetBytes(message));}await writer.CompleteAsync();Console.ReadKey();});var connection = await listener.AcceptConnectionAsync();Console.WriteLine($"Client [{connection.RemoteEndPoint}]: connected");var stream = await connection.AcceptInboundStreamAsync();Console.WriteLine($"Stream [{stream.Id}]: created");await ProcessLinesAsync(stream);}// 处理流数据[SupportedOSPlatform("linux")][SupportedOSPlatform("windows")][RequiresPreviewFeatures]static async Task ProcessLinesAsync(QuicStream stream){var reader = PipeReader.Create(stream);var writer = PipeWriter.Create(stream);while (true){ReadResult result = await reader.ReadAsync();ReadOnlySequence<byte> buffer = result.Buffer;while (TryReadLine(ref buffer, out ReadOnlySequence<byte> line)){// Process the line. ProcessLine(line);// Ack //await writer.WriteAsync(System.Text.Encoding.UTF8.GetBytes($"ack: {DateTime.Now.ToString("HH:mm:ss")} \n"));}// Tell the PipeReader how much of the buffer has been consumed.reader.AdvanceTo(buffer.Start, buffer.End);// Stop reading if there's no more data coming.if (result.IsCompleted){break;}}Console.WriteLine($"Stream [{stream.Id}]: completed");await reader.CompleteAsync();await writer.CompleteAsync();}static bool TryReadLine(ref ReadOnlySequence<byte> buffer, out ReadOnlySequence<byte> line){// Look for a EOL in the buffer.SequencePosition? position = buffer.PositionOf((byte)'\n');if (position == null){line = default;return false;}// Skip the line + the \n.line = buffer.Slice(0, position.Value);buffer = buffer.Slice(buffer.GetPosition(1, position.Value));return true;}static void ProcessLine(in ReadOnlySequence<byte> buffer){foreach (var segment in buffer){Console.WriteLine("Recevied -> " + System.Text.Encoding.UTF8.GetString(segment.Span));}Console.WriteLine();}static X509Certificate2 GenerateManualCertificate(){X509Certificate2 cert = null;var store = new X509Store("KestrelWebTransportCertificates", StoreLocation.CurrentUser);store.Open(OpenFlags.ReadWrite);if (store.Certificates.Count > 0){cert = store.Certificates[^1];// rotate key after it expiresif (DateTime.Parse(cert.GetExpirationDateString(), null) < DateTimeOffset.UtcNow){cert = null;}}if (cert == null){// generate a new certvar now = DateTimeOffset.UtcNow;SubjectAlternativeNameBuilder sanBuilder = new();sanBuilder.AddDnsName("localhost");using var ec = ECDsa.Create(ECCurve.NamedCurves.nistP256);CertificateRequest req = new("CN=localhost", ec, HashAlgorithmName.SHA256);// Adds purposereq.CertificateExtensions.Add(new X509EnhancedKeyUsageExtension(new OidCollection{new("1.3.6.1.5.5.7.3.1") // serverAuth}, false));// Adds usagereq.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, false));// Adds subject alternate namesreq.CertificateExtensions.Add(sanBuilder.Build());// Signusing var crt = req.CreateSelfSigned(now, now.AddDays(14)); // 14 days is the max duration of a certificate for thiscert = new(crt.Export(X509ContentType.Pfx));// Savestore.Add(cert);}store.Close();var hash = SHA256.HashData(cert.RawData);var certStr = Convert.ToBase64String(hash);//Console.WriteLine($"\n\n\n\n\nCertificate: {certStr}\n\n\n\n"); // <-- you will need to put this output into the JS API call to allow the connectionreturn cert;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/44204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【独家揭秘】视频号矩阵系统火爆上线,一键式多平台管理,你的内容营销神器!

在信息爆炸的时代&#xff0c;内容创作者们面临着前所未有的挑战与机遇。如何让自己的内容在众多平台中脱颖而出&#xff0c;快速传播并吸引大量观众&#xff0c;成为了每个创作者关注的焦点。近日&#xff0c;一款名为“迅狐视频号矩阵系统”的神器震撼来袭&#xff0c;它以其…

UV胶,它是否有毒?如同那些隐藏在黑暗中的危险之物?

UV胶&#xff0c;它是否有毒&#xff1f;如同那些隐藏在黑暗中的危险之物&#xff1f; 关于uv胶的毒性问题&#xff0c;或许我们可以这样深入探讨。UV胶&#xff0c;如同一位戴着神秘面纱的访客&#xff0c;在我们的生活中悄然出现&#xff0c;却带着诸多疑问。那么&#xff0…

二维码生成需知:名片二维码尺寸多少合适?电子名片二维码制作方法?

随着数字化时代的到来&#xff0c;二维码在各个领域的应用越来越广泛&#xff0c;名片作为商业交流的重要工具之一&#xff0c;也开始逐渐融入二维码的元素。通过在名片上添加二维码&#xff0c;我们可以轻松实现信息的快速传递和分享。然而&#xff0c;名片二维码的尺寸选择成…

Monorepo仓库管理策略之 Lerna

这里写目录标题 前言&#xff1a;一、简介二、新建项目使用安装生成结构 三、复用现有项目执行命令查看包 四、配置package相互引用导入现有的包 五、发布包确定项目版本发布项目添加项目到到git发布包到NPM包发布出错解决方案 五、实例代码 前言&#xff1a; 将大型代码仓库分…

Python 与扣子 API的链接

当 Python 与各种 API 进行链接时&#xff0c;更是能碰撞出无数精彩的火花&#xff0c;为我们的开发工作带来极大的便利和创新。今天&#xff0c;咱们就来聊聊 Python 与扣子 API 的链接那些事儿。 扣子 API 作为一种新兴的技术接口&#xff0c;为我们提供了丰富的数据和功能。…

文心一言的流式接口数据进行处理 增加属性

需求&#xff1a;需要对文心一言的流式接口数据进行处理 增加属性 return ResponseEntity.ok().header("Access-Control-Allow-Origin", "*").contentType(org.springframework.http.MediaType.TEXT_EVENT_STREAM).cacheControl(org.springframework.http…

python调用串口收发数据

1、确认串口信息 2、安装pyserial库 打开终端或命令行&#xff0c;敲入这行命令&#xff1a;pip install pyserial 3、python编程 import serial def main(): #创建串口对象 ser serial.Serial(COM4, 9600, timeout1) if not ser.isOpen(): print("串…

飞睿智能6公里WiFi图传接收模块,低延迟、抗干扰、高速稳定传输数据,无人机、农田远距离WiFi模块

在科技日新月异的今天&#xff0c;无线通信技术正以前所未有的速度发展&#xff0c;不仅改变了我们的生活方式&#xff0c;还为企业带来了前所未有的商业机遇。今天&#xff0c;我要向大家介绍一款飞睿智能的产品——6公里WiFi图传接收模块&#xff0c;它以其高性能、稳定的传输…

【常见的设计模式】单例模式

参考&#xff1a;【设计模式专题之单例模式】1.小明的购物车 【设计模式专题之单例模式】 1.小明的购物车 时间限制&#xff1a;1.000S 空间限制&#xff1a;256MB   题目描述 小明去了一家大型商场&#xff0c;拿到了一个购物车&#xff0c;并开始购物。请你设计一个购物车管…

【React】基础数据回填--useForm与setFieldsValue详解

相关属性 1.form 2.setFieldsValue 代码 import{Form }from"antd";const Publish =

体积大的快递怎么寄便宜?如何寄件寄包裹更省钱?

大学毕业了&#xff0c;面对即将到来的工作生活&#xff0c;小李不得不把宿舍里的大包小包打包寄回家。可是&#xff0c;当他真正开始打包行李时&#xff0c;才发现这可不是一件简单的事&#xff1a;衣服、被子、书籍、杂物……这些东西加起来体积不小&#xff0c;想要省钱寄快…

虚拟化技术 DeskV(或Desktop Virtualization)

DeskV&#xff08;或Desktop Virtualization&#xff09;&#xff0c;即桌面虚拟化技术&#xff0c;是一种将计算机的桌面系统&#xff08;包括操作系统、应用程序和用户数据&#xff09;进行虚拟化&#xff0c;以实现桌面使用的安全性和灵活性的技术。以下是关于DeskV&#xf…

基于stm32单片机的智能手环的设计

摘 要 随着科技的飞速发展和人们生活水平的提高&#xff0c;健康与科技日益融合&#xff0c;智能可穿戴设备已成为现代人生活中不可或缺的一部分。智能手环&#xff0c;作为一种便携、实用且功能丰富的可穿戴设备&#xff0c;受到越来越多用户的喜爱。它不仅能够实时监测用户的…

简化嵌入式Linux开发:在Ubuntu上安装和配置交叉编译环境的高效方法

在嵌入式Linux开发中&#xff0c;我们通常需要在Ubuntu上安装交叉编译工具链&#xff0c;并配置相关文件。编译过程中&#xff0c;如果遇到依赖库问题&#xff0c;还需要手动查找并编译开源源码。这些步骤较为繁琐&#xff0c;为了简化操作&#xff0c;我们可以尝试以下方案&am…

深度解析:银行小额支付与大额支付的关键区别与应用场景

一、交易金额 小额支付&#xff1a;通常适用于金额在5万元以下的支付场景。这种支付方式更适合个人用户或小额交易场景&#xff0c;如便利店购物、支付停车费、小额汇款等。大额支付&#xff1a;涉及金额较大的支付交易&#xff0c;一般被定义为单笔交易金额超过一定数额&…

特殊的“user profile service服务登录失”情况

记录一下比较特殊的user profile service服务登录失败情况 公司电脑&#xff0c;某次之后每次来公司电脑开机后就会出现这个情况&#xff0c;后来发现只要是关机后再开机百分百出现&#xff0c;重启就不会&#xff0c;一开始也百度、google了&#xff0c;网上有很多解决方式&am…

DropNotch for Mac v1.0.1 在 Mac 刘海快速使用 AirDrop

应用介绍 DropNotch 是一款专为Mac设计的应用程序&#xff0c;可以将MacBook的凹口区域&#xff08;刘海&#xff09;转换为文件放置区。 功能特点 文件共享: 用户可以将文件拖放到MacBook的凹口区域&#xff0c;并通过AirDrop、邮件、消息等方式轻松共享。多显示器支持: 即…

.Net C#执行JavaScript脚本

文章目录 前言一、安装二、执行 JavaScript 脚本三、与脚本交互四、JS 调用 C# 方法五、多线程使用总结 前言 ClearScript 是一个 .NET 平台下的开源库&#xff0c;用于在 C# 和其他 .NET 语言中执行脚本代码。它提供了一种方便和安全的方法来将脚本与应用程序集成&#xff0c;…

PHP酒店宾馆民宿多商户版系统小程序源码

解锁酒店新境界&#xff01;揭秘多商户版系统的无限可能&#x1f3e8;✨ &#x1f680; 开篇&#xff1a;酒店业的新革命&#xff0c;多商户版系统来袭&#xff01; 你是否梦想过将你的酒店打造成一个集餐饮、娱乐、购物于一体的综合型休闲空间&#xff1f;现在&#xff0c;这…

【linux】服务器卸载cuda

【linux】服务器卸载cuda 文章目录 【linux】服务器卸载cuda1、查找已安装的 CUDA 包&#xff1a;2、卸载 CUDA&#xff1a;3、删除残留文件4、更新系统的包索引&#xff1a;5、检查是否卸载干净&#xff1a; 1、查找已安装的 CUDA 包&#xff1a; dpkg -l | grep cuda2、卸载…