Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets rust非阻塞openssl流_Sockets_Rust_Stream_Openssl_Nonblocking - Fatal编程技术网

Sockets rust非阻塞openssl流

Sockets rust非阻塞openssl流,sockets,rust,stream,openssl,nonblocking,Sockets,Rust,Stream,Openssl,Nonblocking,正在尝试创建非阻塞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(); s

正在尝试创建非阻塞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 
线程“”在一个`Err`值上调用`Result::unwrap()`时惊慌失措:WouldBlock(MIDHANDSHAKESLStream{stream:SslStream{stream:TcpStream{addr:V4(10.137.0.17:55628),peer:V4(172.217.21.78:443),fd:3},ssl:ssl{状态:“SSLv3/TLSwrite client hello”,验证结果:X509VerifyResult{code:0,错误:“ok”},错误:错误:}{code:ErrorCode(2),原因:Some(Io(Os{code:11,种类:WouldBlock,消息:“资源暂时不可用”}}})}),src/libcore/result.rs:1051:5

如何创建非阻塞ssl流?

东京项目有
tokio openssl
机箱。您可能需要采用整个
async/await
机制,并使用该机箱执行非阻塞openssl:

/#openssl=“0.10.25”
//#tokio=“0.2.0-alpha.6”
//#tokio net=“0.2.0-alpha.6”
//#东京openssl=“0.4.0-alpha.6”
使用openssl::ssl::{SslMethod,SslConnector};
使用tokio::net::TcpStream;
使用东京::前奏::*;
使用tokio_net::driver::Handle;
使用tokio_openssl::connect;
使用std::error::error;
#[tokio::main]
异步fn main()->结果{
让sslconf=SslConnector::builder(SslMethod::tls())?
.build()
.configure()?;
//以下三行相当于:
//让stream=TcpStream::connect(“google.com:443”)。等待?;
//这将表明套接字确实是非阻塞的。
让stream=std::net::TcpStream::connect(“google.com:443”)?;
stream.set_非阻塞(true)?;
让stream=TcpStream::from_std(stream,&Handle::default())?;
让mut stream=connect(sslconf,“google.com”,stream)?;
stream.write_all(b“GET/HTTP/1.0\r\n\r\n”)。等待?;
让mut res=vec![];
stream.read_to_end(&mut res)。wait?;
dbg!(字符串::from_utf8_lossy(&res));
好(())
}

当然,这也意味着现在你必须使用beta/夜间频道。它可能对你的项目有效,也可能无效。

如果需要非阻塞流,但你不想添加东京作为依赖项,可能的解决方案是:

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);
而且不是一回事。