我试着用Tokio来弄湿脚。当我从远程登录连接发送消息时,我得到Custom { kind: InvalidData, error: FrameTooBig }。我不明白这个问题,也不知道如何克服它。
extern crate tokio;
extern crate tokio_io;
use tokio::io;
use tokio::net::TcpListener;
use tokio::prelude::*;
use tokio_io::codec::length_delimited;
fn main() {
let addr = "127.0.0.1:12345".parse().unwrap();
let listener = TcpListener::bind(&addr).unwrap();
let server = listener
.incoming()
.for_each(|socket| {
let transport = length_delimited::Builder::new().new_read(socket);
let msg_proccessing = transport
.for_each(|msg| {
// Note: This part is never actually executed
println!("{:?}", msg);
Ok(())
})
.map_err(|e| println!("waaaaaaaaaaaaaaaaa {:?}", e));
tokio::spawn(msg_proccessing);
Ok(())
})
.map_err(|_| {});
tokio::run(server);
}客户端:
▶ telnet localhost 12345
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
\x00\x00\x00\x0bhello world
Connection closed by foreign host.发布于 2018-04-25 04:26:32
问题出在客户端,它与Telnet的工作方式有关。使用Telnet发送十六进制数据并不简单,所以我尝试了一下,效果很好:
echo '\x00\x00\x00\x0bhello world' | nc localhost 12345 #WORKS!但是,这两种方法都不起作用:
似乎FrameTooBig错误是由于telnet发送的消息比服务器预期的要大。我无法使用十六进制对帧进行正确编码,然后长度与收到的length头不匹配,因此出现了错误。
https://stackoverflow.com/questions/49981540
复制相似问题