正在尝试创建非阻塞ssl流:
use openssl::ssl::{SslMethod, SslConnector};
use std::io::{Read, Write};
use std::net::TcpStream;
let connector = SslConnector::builder(SslMethod::tls()).unwrap().build();
let stream = TcpStream::connect("google.com:443").unwrap();
stream.set_nonblocking(true);
let mut stream = connector.connect("google.com", stream).unwrap();但是我得到了这个错误:
thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value:WouldBlock(MidHandshakeSslStream { stream: SslStream { stream: TcpStream { addr:V4(10.137.0.17:55628), peer: V4(172.217.21.78:443), fd: 3 }, ssl: Ssl { state: "SSLv3/TLSwrite client hello", verify_result: X509VerifyResult { code: 0, error: "ok" } } }, error: Error { code: ErrorCode(2), cause: Some(Io(Os { code: 11, kind: WouldBlock, message: "Resource temporarily unavailable" })) } })', src/libcore/result.rs:1051:5 如何创建非阻塞ssl流?
发布于 2019-10-20 00:15:44
东京项目有tokio-openssl板条箱。您可能需要包含整个async/await机制,并使用该机箱来执行非阻塞openssl:
//# openssl = "0.10.25"
//# tokio = "0.2.0-alpha.6"
//# tokio-net = "0.2.0-alpha.6"
//# tokio-openssl = "0.4.0-alpha.6"
use openssl::ssl::{SslMethod, SslConnector};
use tokio::net::TcpStream;
use tokio::prelude::*;
use tokio_net::driver::Handle;
use tokio_openssl::connect;
use std::error::Error;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let sslconf = SslConnector::builder(SslMethod::tls())?
.build()
.configure()?;
// The following 3 lines are equivalent to:
// let stream = TcpStream::connect("google.com:443").await?;
// It's just going to show that the socket is indeed nonblocking.
let stream = std::net::TcpStream::connect("google.com:443")?;
stream.set_nonblocking(true)?;
let stream = TcpStream::from_std(stream, &Handle::default())?;
let mut stream = connect(sslconf, "google.com", stream).await?;
stream.write_all(b"GET / HTTP/1.0\r\n\r\n").await?;
let mut res = vec![];
stream.read_to_end(&mut res).await?;
dbg!(String::from_utf8_lossy(&res));
Ok(())
}当然,这也意味着现在你必须使用beta/nightly channel。它可能会也可能不会对你的项目起作用。
发布于 2019-10-22 18:21:58
如果需要非阻塞流,但您不想将tokio添加为依赖项,则可能的解决方案是:
use openssl::ssl::{SslMethod, SslConnector};
use std::io::{Read, Write};
use std::net::TcpStream;
let connector = SslConnector::builder(SslMethod::tls()).unwrap().build();
let stream = TcpStream::connect("google.com:443").unwrap();
let mut stream = connector.connect("google.com", stream).unwrap();
let inner_stream = stream.get_ref();
inner_stream.set_nonblocking(true);发布于 2021-09-01 19:35:09
使用tokio,使用它创建的任何套接字都会自动配置为非阻塞。
我建议去看看tokio-native-tls,看看its examples。
它依赖于native-tls,它是特定于平台的TLS实现的抽象。
具体地说,这个机箱在Windows上使用SChannel (通过schannel机箱),在macOS上使用安全传输(通过安全框架机箱),在所有其他平台上使用OpenSSL (通过openssl机箱)。
除非您有一个非常具体的用例,否则这可能正是您所需要的。
https://stackoverflow.com/questions/58463007
复制相似问题