< 返回版块

JH-7 发表于 2020-08-31 20:29

Tags:rust,http,ERR_CONNECTION_RESET

正在学习rust,来实现http服务。 抄作业来实现:https://github.com/NullSense/Linda/tree/5a86c25f7c8dec9ad975c9569ce166e22f7a07ee

但是chrome浏览器直接提示 Failed to load resource: net::ERR_CONNECTION_RESET 这个错误

但是我用postman,却直接可以返回正常的html代码

求指教,为啥会这样

评论区

写评论
gwy15 2020-08-31 23:19
  1. 这是单线程处理的服务器
  2. chrome 会建立多个 TCP 连接到服务器,很大概率第一个建立的连接只是占位的,并不发送数据。
  3. 第一个占位连接(三次握手)建立后,进入 lib.rs 里面的 stream.read(&mut buffer),而这个 Read trait 是阻塞的,直接堵死主线程。
  4. 于是第一个连接,连带着第二个(发送 GET / HTTP/1.1 的)TCP 连接一起超时。
  5. 解决方法: 5.1 使用多线程,每个 TCP 连接都单独占一个线程。 5.2 设置每个 TCP 连接的 read timeout,超时直接关闭。
stream
    .set_read_timeout(Some(std::time::Duration::from_millis(10)))
    .unwrap();
chinagxwei 2020-08-31 22:09
let mut buffer = [0; 512];

修改打大一些试一下,之前我根据官方案例练习时是出现buffer太小,调整以后就正常了。

Mike Tang 2020-08-31 21:55

火狐试一下

1 共 3 条评论, 1 页