如果 Rust 中缓冲区已满,则发送字节

问题描述 投票:0回答:0

我正在尝试从客户端服务器应用程序写入和读取字节。在服务器端,我有两个不同的线程,一个通过 TCP 连接到客户端,另一个从前一个线程接收数据并将其写入存储字节向量的共享队列。总之,客户端向服务器发送字节,该服务器使用第一个线程读取它们,然后通过负责将它们写入字节向量队列的内部通道将它们发送到下一个线程。

我遇到的问题是,tcp 并不总是到达相同大小的字节。因此,即使我分配“大”缓冲区大小,由于 tcp 读取的数据包,队列也会填满较小的缓冲区。我的想法是利用字节向量的最大分配容量来有效填充队列。

这是一个小例子(这不是一个现实的例子,因为总是可以处理 5 个字节。这只是一个小例子,说明如果我发送 128Kb 会发生什么。):

Client -> send -> [1, 2, 3, 4, 5] (5 bytes)

Thread 1 buffer_size = 5b;
Thread 2 queue_size = 3 slots.

TCP -> Thread 1 -> read -> [1, 2, 3] -> Send to thread 2
Thread 2 -> write buff to queue -> [[1, 2, 3]]
Thread 1 -> read -> [4, 5] -> Send to thread 2
Thread 2 -> write buff to queue -> [[1, 2, 3],[4, 5]]

如您所见,由于 tcp 读取的字节较少,因此我无法填充此缓冲区,因此无法利用最大总空间,而不是让缓冲区充满 5 个字节。如果有 5 个字节和 3 个位置,我最多可以存储 15 个字节。遇到这个问题时,我只剩下 5 个字节用于两个位置。

我有这段代码来发送从 tcp 读取的字节。您可以看到我根据大小截断了缓冲区。我想修改这个实现以便能够完全填充缓冲区。

loop {

       let capacity = 262144;
       let mut buffer = Vec::<u8>::with_capacity(capacity);

       match tcp_reader.try_read_buf(&mut buffer) {
             Ok(0) => break,
             Ok(n) => {
                     println!("Client Write: Reading Buffer: n_bytes {:?}", n);

                     buffer.truncate(n);
                     let len = buffer.len() as u16;

                     //header to control buff_size
                     buffer.insert(0, len as u8);
                     buffer.insert(0, len.swap_bytes() as u8);
                     send_to_thread2.send(buffer)?;
              },
              Err(_e) => (),
       }
                    
}

我有两个问题:

  • 我应该如何继续实现我的目标?我知道我应该查看长度并根据此读取或发送字节,但我在所有权和清理缓冲区以便稍后读取方面遇到问题。
  • 如果两个缓冲区连接起来超过了最大容量,有没有办法根据最大分配容量来切割缓冲区,发送这个缓冲区并用剩余字节创建另一个缓冲区?

非常感谢!

rust tcp buffer
© www.soinside.com 2019 - 2024. All rights reserved.