【问题标题】:Idiomatic way to handle writes to a TcpStream while waiting on read在等待读取时处理对 TcpStream 的写入的惯用方法
【发布时间】:2014-02-05 02:58:52
【问题描述】:

作为熟悉 Rust 和一般网络的一种方式,我开始编写一个非常基本的 telnet 聊天服务器。一切似乎都很顺利,但现在我得到了不安全的代码块,我想知道是否有更好的方法来做事。

我生成一个任务来侦听与此类似的连接:Example TCP server written in Rust 一旦用户连接并获得 TcpStream,我将其放入 Connection 结构中。 Connection 结构使用通道与两个任务进行通信——一个用于从其 TcpStream 中读取,另一个用于写入。读取任务阻塞 TcpStream 的 read() 方法并将任何输入发送回 Connection 结构。 writer 阻塞 Port 的 recv() 方法,并将接收到的任何内容写入 TcpStream。这样,程序的主循环就可以简单地维护一个 Connection 结构体的向量来检查用户输入并随意写入。问题是,在这个实现中,TcpStream 必须由读写任务共享,并且调用可变的 write() 方法,而可变的 read() 方法仍在其他任务中阻塞。在 0.8 中,我使用 Rc 和 unsafe_borrow_mut 来做到这一点,但如果可以的话,我想以更好的方式来做——据我所知,在这种情况下,Rust 类型系统的反对意见可能是完全有效的。任何关于整体设计的 cmets 也将受到欢迎。谢谢。

【问题讨论】:

  • 目前你可以在master上克隆TcpStream并同时进行读写

标签: rust


【解决方案1】:

目前没有惯用的方法来做到这一点,因为 Rust 的 IO API 目前不支持并行读取或写入。 有关更多信息,请参阅此问题:https://github.com/mozilla/rust/issues/11165 将重新设计 TcpStream API 以允许以一种或另一种方式进行此类操作(请参阅问题),然后将提供一种“惯用方式”来执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    相关资源
    最近更新 更多