首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在使用Tokio的frame_delimited时会出现FrameTooBig错误?

为什么在使用Tokio的frame_delimited时会出现FrameTooBig错误?
EN

Stack Overflow用户
提问于 2018-04-23 20:50:02
回答 1查看 130关注 0票数 0

我试着用Tokio来弄湿脚。当我从远程登录连接发送消息时,我得到Custom { kind: InvalidData, error: FrameTooBig }。我不明白这个问题,也不知道如何克服它。

代码语言:javascript
复制
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);
}

客户端:

代码语言:javascript
复制
▶ telnet localhost 12345                                     
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
\x00\x00\x00\x0bhello world
Connection closed by foreign host.
EN

回答 1

Stack Overflow用户

发布于 2018-04-25 04:26:32

问题出在客户端,它与Telnet的工作方式有关。使用Telnet发送十六进制数据并不简单,所以我尝试了一下,效果很好:

代码语言:javascript
复制
echo '\x00\x00\x00\x0bhello world' | nc localhost 12345  #WORKS!

但是,这两种方法都不起作用:

  1. echo‘\x00\x0bhello world’| telnet localhost
  2. ▶telnet localhost 12345正在尝试127.0.0.1...已连接到本地主机。转义字符是'^]‘。\x00\x0bhello全局连接被外部主机关闭。

似乎FrameTooBig错误是由于telnet发送的消息比服务器预期的要大。我无法使用十六进制对帧进行正确编码,然后长度与收到的length头不匹配,因此出现了错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49981540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档