Rust:安全的单线程TCP服务器

Rust:安全的单线程TCP服务器,rust,tcplistener,unsafe,single-threaded,Rust,Tcplistener,Unsafe,Single Threaded,在纯rust环境下是否可以编写单线程TCP服务器? 在C语言中,我将使用select系统调用“侦听”多个套接字。 我只在人们使用“不安全”来使用epoll/select的情况下找到解决方案,但我确实希望避免这种情况。我认为这是一项基本任务,我无法想象没有纯防锈剂来解决这一任务。 基本上,我在标准库中寻找一个抽象 以下是我想要的C语言: 例如,使用不安全的select/epoll: 选择,好友就是系统调用。要使用选择和friends,Rust需要调用这些系统调用。这些系统调用不是用Rust表示的

在纯rust环境下是否可以编写单线程TCP服务器? 在C语言中,我将使用select系统调用“侦听”多个套接字。 我只在人们使用“不安全”来使用epoll/select的情况下找到解决方案,但我确实希望避免这种情况。我认为这是一项基本任务,我无法想象没有纯防锈剂来解决这一任务。 基本上,我在标准库中寻找一个抽象

以下是我想要的C语言:

例如,使用不安全的select/epoll:
选择
,好友就是系统调用。要使用
选择
和friends,Rust需要调用这些系统调用。这些系统调用不是用Rust表示的,它们使用C语义(当通过libc调用它们时)或汇编(当直接调用它们时)

从生锈的角度来看,这意味着它们是不安全的,生锈编译器根本无法知道它们在做什么

这意味着,为了防止生锈,您有两种选择:

  • 使用
    unsafe
  • 或者使用更高级别的软件包,最终调用它们(内部使用不安全),比如tokio

即使有(仅限linux)纯粹的rust和以rust为目标的libc改造,它最终也必须使用
safe
,以创建实际的系统调用并调用内核。假设的纯锈蚀裸金属单内核也是如此。

我最终使用了async/await。在这个例子中是不正确的错误处理

use async_std::net::TcpListener;
use async_std::task;
use async_tungstenite::accept_async;
use futures::{
    SinkExt,
    StreamExt,
};
use std::net::SocketAddr;
use std::str::FromStr;


async fn run() {
    let addrs = [
        SocketAddr::from_str("0.0.0.0:9001").unwrap(),
        SocketAddr::from_str("[::]:9001").unwrap()];
    let listener = TcpListener::bind(&addrs[..]).await.unwrap();

    listener.incoming().for_each_concurrent(None, |stream| async move {
        let mut websocket = accept_async(stream.unwrap()).await.unwrap();
        loop {
            let msg = websocket.next().await.unwrap().unwrap();
            println!("Received {}", msg);
            if msg.is_binary() || msg.is_text() {
                websocket.send(msg).await.unwrap();
            }
        }
    }).await;
}


fn main () {
    task::block_on(run());
}

很抱歉造成混淆,我不想在rust中调用select,我想要一个行为相同的纯rust抽象,我想要一个rust中的单线程TCP服务器。有办法做到这一点吗?你不想调用select并不重要,因为在一天结束时,无论你使用哪种“纯锈抽象”(同样是像tokio&al这样的事件反应堆)都必须调用它,或者epoll,或者其他什么。所以这一层会涉及到不安全因素,所以不可能做到这一点?如果我问是否可以打开/读取/关闭文件,您会告诉我使用safe std::fs,而不会指出这些是系统调用。那么,为什么有问题要告诉我,不使用不安全的代码是不可能的呢?我真的不明白为什么在标准库中这种任务显然没有安全的抽象。我不是说没有安全的抽象,我已经给了你一些例子。