gpt4 book ai didi

tcp - 从 TcpStream 读取结果为空缓冲区

转载 作者:可可西里 更新时间:2023-11-01 02:36:53 25 4
gpt4 key购买 nike

我想从 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 []

当我使用 stream.read_to_end 时,缓冲区已填满,但这花费的时间太长了。

在 Python 中我可以做类似的事情

import socket 

TCP_IP = '127.0.0.1'
TCP_PORT = 3306
BUFFER_SIZE = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
#s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()
print "received data:", data

我如何在 Rust 中实现这一点?

最佳答案

由于不同的原因,您尝试的两种方法均无效:

  • read() :“不提供任何关于它是否阻塞等待数据的保证”。一般来说,read() 从用户的角度来看是不可靠的,只能用作更高级别函数的构建 block ,例如 read_to_end()

    但也许更重要的是,您的代码中有一个错误:您通过 with_capacity() 创建向量,它在内部保留内存,但不会更改向量的长度。它仍然是空的!当您现在像 &buf 一样对它进行切片时,您将一个空切片传递给 read(),因此 read() 无法读取任何实际数据。要解决这个问题,需要初始化 vector 的元素: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_exact(&mut buf);

println!("{:?}", buf);

你也可以使用 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);

如果你想多次使用流,你可能想使用 by_ref()在调用 take() 之前。

虽然这两个代码片段并不等同!请阅读文档以获取更多详细信息。

关于tcp - 从 TcpStream 读取结果为空缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46500747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com