gpt4 book ai didi

sockets - Rust 持久化 TcpStream

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

我似乎在与 std::io::TcpStream 作斗争。我实际上是在尝试打开与另一个系统的 TCP 连接,但下面的代码完全模拟了这个问题。

我有一个 Tcp 服务器,它在打开时简单地将“Hello World”写入 TcpStream,然后循环以保持连接打开。

fn main() {
let listener = io::TcpListener::bind("127.0.0.1", 8080);
let mut acceptor = listener.listen();
for stream in acceptor.incoming() {

match stream {
Err(_) => { /* connection failed */ }
Ok(stream) => spawn(proc() {
handle(stream);
})
}
}
drop(acceptor);
}

fn handle(mut stream: io::TcpStream) {
stream.write(b"Hello Connection");
loop {}
}

客户端所做的只是尝试从连接中读取一个字节并打印它。

fn main() {
let mut socket = io::TcpStream::connect("127.0.0.1", 8080).unwrap();
loop {
match socket.read_byte() {
Ok(i) => print!("{}", i),
Err(e) => {
println!("Error: {}", e);
break
}
}
}
}

现在的问题是,在我终止服务器或关闭 TCP 连接之前,我的客户端在读取时一直处于阻塞状态。这不是我想要的,我需要打开一个 TCP 连接很长时间,并在客户端和服务器之间来回发送消息。我在这里误解了什么?我与我正在通信的真实系统有完全相同的问题 - 只有在我终止连接后我才会畅通无阻。

最佳答案

不幸的是,Rust 现在没有任何异步 I/O 的功能。那里are一些试图纠正这种情况的尝试,但还远未完成。也就是说,希望使真正的异步 I/O 成为可能(建议包括同时选择 I/O 源和 channel ,这将允许通过事件在 I/O 操作中阻塞的唤醒任务 channel ,虽然目前还不清楚这应该如何在所有支持的平台上实现),但据我所知,还有很多工作要做,而且现在没有什么真正可用的。

不过,您可以在某种程度上通过超时来模拟这一点。这远非最佳解决方案,但它确实有效。它可能看起来像这样(来 self 的代码库的简化示例):

let mut socket = UdpSocket::bind(address).unwrap();

let mut buf = [0u8, ..MAX_BUF_LEN];
loop {
socket.set_read_timeout(Some(5000));
match socket.recv_from(buf) {
Ok((amt, src)) => { /* handle successful read */ }
Err(ref e) if e.kind == TimedOut => {} // continue
Err(e) => fail!("error receiving data: {}", e) // bail out
}

// do other work, check exit flags, for example
}

这里 recv_from 将返回 IoError 并且 kind 设置为 TimedOut 如果套接字上没有数据可用在 recv_from 调用中的 5 秒内。您需要在每次循环迭代之前重置超时,因为它更像是一个“截止日期”而不是超时 - 当超时时,所有调用都将开始失败并出现超时错误。

这绝对不是应该的方式,但 Rust 目前没有提供更好的方法。至少它发挥了作用。

更新

现在尝试创建一个异步事件循环和基于它的网络 I/O。它叫做mio .对于异步 I/O,它可能是一个很好的临时(甚至是永久性的,谁知道呢)解决方案。

关于sockets - Rust 持久化 TcpStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25637556/

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