我使用 Rust 中的板条箱
quinn
创建了一个 QUIC 服务器。代码如下:
use std::net::SocketAddr;
use quinn::{Endpoint, ServerConfig};
use rcgen::Error;
use rustls::Certificate;
#[tokio::main]
async fn main() {
println!("start");
server().await;
println!("stop")
}
static SERVER_NAME: &str = "localhost";
fn server_addr() -> SocketAddr {
"127.0.0.1:5001".parse::<SocketAddr>().unwrap()
}
async fn server() {
let (cert, key) = generate_self_signed_cert().unwrap();
let config = configure_server(cert, key);
// Bind this endpoint to a UDP socket on the given server address.
let endpoint = Endpoint::server(config, server_addr()).unwrap();
// Start iterating over incoming connections.
while let Some(conn) = endpoint.accept().await {
let mut _connection = conn.await.unwrap();
}
}
fn configure_server(cert: Certificate, key: rustls::PrivateKey) -> ServerConfig {
ServerConfig::with_single_cert(vec![cert], key).unwrap()
}
fn generate_self_signed_cert() -> Result<(rustls::Certificate, rustls::PrivateKey), Error> {
let cert = rcgen::generate_simple_self_signed(vec![SERVER_NAME.to_string()])?;
let key = rustls::PrivateKey(cert.serialize_private_key_der());
Ok((rustls::Certificate(cert.serialize_der()?), key))
}
Cargo.toml 在这里:
[dependencies]
quinn = "*"
rustls = { version = "*", features = ["dangerous_configuration", "quic"] }
rcgen = "*"
tokio = { version = "1", features = ["rt", "macros", "rt-multi-thread"] }
很简单,对吧。我在函数
generate_self_signed_cert
中生成自签名证书。
上面的代码来自this quinn介绍
我通过
cargo run
运行代码并控制台输出:
start
这表明它正在工作。
我在下面写了一些 React 代码:
function App() {
async function handle3() {
let tran = new WebTransport("https://127.0.0.1:5001");
await tran.ready;
}
return (
<>
<button onClick={async () => await handle3()}>
CLICK
</button>
</>
)
}
点击按钮时会尝试连接QUIC服务器,很简单,对吧。
但它不起作用!
devtool 控制台出现一些错误:
Uncaught (in promise)
WebTransportError { source: "session", streamErrorCode: null, name: "WebTransportError", message: "WebTransport connection rejected", code: 0, result: 0, filename: "", lineNumber: 0, columnNumber: 0, data: null }
您可以看到消息:WebTransport 连接被拒绝。 服务器不输出其他内容。 但我不知道为什么..
我尝试连接
https://127.0.0.1:5001
或https://localhost:5001
或https://localhost
,但也不起作用
我尝试修改主机文件并添加地图:
127.0.0.1 localhost
但不工作。
如何修复此错误并连接到 quic 服务器?
谢谢。
while let Some(conn) = endpoint.accept().await {
let mut _connection = conn.await.unwrap();
}
这将接受每个传入连接,然后立即删除连接,从而关闭它。就 WebTransport 握手失败而言,这可能是您的第一个问题。可能还需要在 QUIC 之上完成额外的 WebTransport 握手,因此您需要使用一些 WebTransport 箱而不仅仅是 quinn?