буфер в потоках rust-tokio есть ли способ использовать что-то другое, кроме & [u8]? - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь создать эхо-сервер с прописной строкой, когда он отвечает, для тренировки с токио в качестве упражнения.Я использовал массив в качестве буфера, что раздражает, потому что, если строка переполняет буфер?

Я хотел бы знать, есть ли лучший способ для этого без использования массива, в идеале просто с помощью Строка или вектор без необходимости создания буферного массива.

Я попытался read_from_string (), но не async и заканчивает тем, что блокировал сокет.

extern crate tokio;
use tokio::net::TcpListener;
use tokio::prelude::*;

fn main() {
    let addr = "127.0.0.1:6142".parse().unwrap();
    let listener = TcpListener::bind(&addr).unwrap();

    let server = listener
        .incoming()
        .for_each(|socket| {

            let (mut reader, mut writer) = socket.split();
            let mut buffer = [0; 16];
            reader.poll_read(&mut buffer)?;

            let s = std::str::from_utf8(&buffer).unwrap();
            s.to_uppercase();
            writer.poll_write(&mut s.as_bytes())?;

            Ok(())
        })
        .map_err(|e| {
            eprintln!("something went wrong {}", e);
        });

    tokio::run(server);
}

Результаты: «012345678901234567890» становится -> «0123456789012345»

Я мог бы, конечно, увеличить буфер, но он просто пнул бы по дороге.

1 Ответ

2 голосов
/ 16 мая 2019

Я считаю, tokio_codec - правильный инструмент для таких задач. Документация Tokio: https://tokio.rs/docs/going-deeper/frames/

Он использует Bytes / BytesMut в качестве буфера - очень мощная структура, которая позволит вам обрабатывать ваши данные так, как вы хотите, и избегать ненужных копий

...