带环形缓冲器的铁锈TCP客户机

带环形缓冲器的铁锈TCP客户机,tcp,rust,circular-buffer,Tcp,Rust,Circular Buffer,在Rust 0.9和现在的0.10中,我尝试在Rust中实现一个简单的tcp客户端,将数据存储在环形缓冲区中,认为这是处理任务和端口/通道提供不可预测输入的好方法。但是我被TcpStream的东西给缠住了 这是我的环形缓冲区实现。它感觉很笨重,但我认为这将是一个有效的概念证明: 静态缓冲区大小:uint=10; 静态缓冲区单元大小:uint=128; 发布结构SimpleRingBuffer{ //请参阅下面的SimpleRingBuffer#new中关于设计的讨论。 单元格:~[Option]

在Rust 0.9和现在的0.10中,我尝试在Rust中实现一个简单的tcp客户端,将数据存储在环形缓冲区中,认为这是处理任务和端口/通道提供不可预测输入的好方法。但是我被TcpStream的东西给缠住了

这是我的环形缓冲区实现。它感觉很笨重,但我认为这将是一个有效的概念证明:

静态缓冲区大小:uint=10;
静态缓冲区单元大小:uint=128;
发布结构SimpleRingBuffer{
//请参阅下面的SimpleRingBuffer#new中关于设计的讨论。
单元格:~[Option],//请参见,它仍然是低级别的,因为原始字节。
最大单元大小:uint,
写入光标:uint,
读取光标:uint,
长度:uint,
}
impl SimpleRingBuffer{
//注意fencepost错误。
pub fn new(缓冲区长度:uint,最大单元格长度:uint)->SimpleRingBuffer{
//这是否应该预先分配阵列以避免调整惩罚?这将意味着剔除
//我想,在其他地方处理尺码的问题,也需要考虑一下。
让mut none_数组:~[选项]=~[];
对于范围(0,缓冲区长度){//FIXME中的每一个μu8,使用适当的ittorator。
//none_array.push(std::vec::with_capacity(max_cell_length));
无\u数组。推送(无);
};
SimpleRingBuffer{
单元格:无数组,
最大单元大小:最大单元长度,
写入游标:0,//不是真正的游标。
读取光标:0,//不是真正的光标。
长度:缓冲区长度
}
}
//FIXME使用和消毒方法。
发布fn写入数据(&mut self,传入数据:&u8]){
如果self.write_cursor==self.length{
self.write_cursor=0;
}
self.cells[self.write_cursor]=Some(传入的_数据.to_owned());
self.write_cursor+=1;
}
发布fn读取单元(&mut self)->~[u8]{
让mut读取数组:~[u8]=~[];
匹配self.cells[self.read\u游标]{
Some(ref n)=>read_array=n.clone(),
无=>()
}
self.read_cursor+=1;
读单元阵列
}
发布fn释放整个缓冲区(&mut self)->~[~[u8]]{
self.read_cursor=0;
让mut buffer_数组:~[~[u8]]=~[];
对于范围内的每个单元格(self.read\u光标、self.length){
buffer_array.push(self.read_cell());
}
self.read_cursor=0;
self.write_cursor=0;
缓冲区数组
}
}
这是我的客户:

pub mod simpletcpclient{
使用std::io::net::ip::SocketAddr;
使用std::io::net::tcp::TcpStream;
使用std::str;
使用simpletcpclient::simpleringbuffer::simpleringbuffer;
静态缓冲区大小:uint=16;
静态缓冲区单元大小:uint=1024;
发布结构SimpleClient{
读取缓冲区:SimpleRingBuffer,
写入缓冲区:SimpleRingBuffer,//未实现
socket:SocketAddr
}
简单客户端{
pub fn new(主机地址:&str)->SimpleClient{
让mut write_buff=SimpleRingBuffer::new(缓冲区大小、缓冲区单元格大小);
让mut read_buff=SimpleRingBuffer::new(缓冲区大小、缓冲区单元格大小);
简单客户端{
读取缓冲区:读取缓冲区,
写入缓冲区:写入缓冲区,
套接字:from_str::(主机地址).unwrap()
}
}
//看https://mail.mozilla.org/pipermail/rust-dev/2013-August/005111.html
发布fn启动客户端(&mut self){
让mut in_stream=TcpStream::connect(self.socket);
让一个请求:~str=~“GET/HTTP/1.1\r\n\r\n”;
//让一个_req:~str=~“GET-over-a-1000.html HTTP/1.1\r\n\r\n”;
自读输入(一个请求);
self.print_read_info();
}
fn read_传入(&mut self,tcp_req:~str){
让mut in_stream=TcpStream::connect(self.socket);
让mut temp_cell=~[0,…缓冲区_cell_SIZE];
in_stream.write(tcp_req.as_bytes());
//TcpStream在这里犹豫不决!
//在流中读取(临时单元);
//让temp_cell=in_stream.read_to_str();
在\u流中。推送\u字节(&mut temp\u单元格、缓冲区\u单元格大小);
自读缓冲区写入数据(临时单元);
}
fn打印读取信息(&mut self){
println!(“释放环形缓冲区内容”);
让released_byte_array=self.read_buffer.release_thigh_buffer();
对于已发布的\u byte\u array.iter()中的每个\u数组{
如果每个_array.len()大于0{
println!(“{}”,str::from_utf8(each_array.clone());
};
};
}
}
如果需要的字节少于1024字节,则返回预期值

我的想法是,因为我不知道我请求的任何数据必然是什么样子,我想请求一定数量的字节,将其作为字节存储在缓冲区中,重复到EOF,然后方便地读取。但是TcpStream方法似乎有不同的预期用途,但我不完全清楚哪一个适合读入一些数据并将其存储在某处以备将来使用

我做错了什么?特别是,假设我想通过TCP拉取一个更大的文件,而不是一个
push_bytes()
。同样地,我的
SimpleRingBuffer
对嵌套向量也不感兴趣,这让我担心在重新运行/增长时会受到惩罚