xha*_*lix 3 tcp tcpclient rust
我想从TCP流中读取数据,但结果为空Vec:
extern crate net2;
use net2::TcpBuilder;
use std::io::Read;
use std::io::Write;
use std::io::BufReader;
let tcp = TcpBuilder::new_v4().unwrap();
let mut stream = tcp.connect("127.0.0.1:3306").unwrap();
let mut buf = Vec::with_capacity(1024);
stream.read(&mut buf);
println!("{:?}", buf); // prints []
Run Code Online (Sandbox Code Playgroud)
当我使用stream.read_to_end缓冲区已填充,但是这花费的时间太长了。
在Python中,我可以做类似的事情
extern crate net2;
use net2::TcpBuilder;
use std::io::Read;
use std::io::Write;
use std::io::BufReader;
let tcp = TcpBuilder::new_v4().unwrap();
let mut stream = tcp.connect("127.0.0.1:3306").unwrap();
let mut buf = Vec::with_capacity(1024);
stream.read(&mut buf);
println!("{:?}", buf); // prints []
Run Code Online (Sandbox Code Playgroud)
如何在Rust中实现这一目标?
您尝试使用的两种方法由于不同的原因而无法工作:
read():“不提供有关是否阻止等待数据的任何保证”。通常,read()(从用户的角度来看)是相当不可靠的,并且只能用作诸如的高级功能的构建块read_to_end()。
但是,也许更重要的是,您的代码中有一个错误:您创建了向量,通过with_capacity()它可以在内部保留内存,但不会更改向量的长度。它仍然是空的!现在像那样对它进行切片时&buf,您将一个空切片传递给read(),因此read()无法读取任何实际数据。为了解决这个问题,向量的元素已经需要初始化:let mut buf = vec![0; 1024]或类似的东西。
read_to_end():read()反复调用,直到遇到EOF。在大多数TCP流情况下,这实际上没有任何意义。
那么您应该使用什么呢?在您的python代码中,您将特定数量的字节读入缓冲区。当然,您也可以在Rust中做到这一点read_exact()。它是这样的:
const BUFFER_SIZE: usize = 1024;
let mut stream = ...;
let mut buf = [0; BUFFER_SIZE];
stream.read_exaxt(&mut buf);
println!("{:?}", buf);
Run Code Online (Sandbox Code Playgroud)
您也可以使用take()。这样您可以使用read_to_end():
const BUFFER_SIZE: usize = 1024;
let mut stream = ...;
let mut buf = Vec::with_capacity(BUFFER_SIZE);
stream.take(BUFFER_SIZE).read_to_end(&mut buf);
println!("{:?}", buf);
Run Code Online (Sandbox Code Playgroud)
如果您想多次使用流,则可能要by_ref()在调用之前使用take()。
这两个代码段不相等!请阅读文档以获取更多详细信息。
| 归档时间: |
|
| 查看次数: |
766 次 |
| 最近记录: |