为什么 WebTransport 无法在 Rust 中连接这个 QUIC 服务器

问题描述 投票:0回答:1

我使用 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 服务器?

谢谢。

web rust quic http3 webtransport
1个回答
0
投票
while let Some(conn) = endpoint.accept().await {
    let mut _connection = conn.await.unwrap();
}

这将接受每个传入连接,然后立即删除连接,从而关闭它。就 WebTransport 握手失败而言,这可能是您的第一个问题。可能还需要在 QUIC 之上完成额外的 WebTransport 握手,因此您需要使用一些 WebTransport 箱而不仅仅是 quinn?

© www.soinside.com 2019 - 2024. All rights reserved.