async-std::net::TcpStream读取函数有数据却不返回的问题排查
async-std TcpStream 跨大西洋连接挂起问题排查
我正在调试一个已持续数日的异常问题,代码中使用async-std::net::TcpStream,核心逻辑如下:
// 初始化socket与连接 let socket = std::net::SocketAddrV4::new(addr, port); let stream = async_std::net::TcpStream::connect(socket).await?; // 获取读写对象 let mut reader = stream.clone(); let mut writer = stream; // 启动写入任务 async_std::task::spawn(async move { Self::start_writer(&mut writer, cmd_rx, username, password, price_modify).await }); // 初始化缓冲区 let mut buffer = bytes::BytesMut::with_capacity(8*1024); // 循环读取并处理数据 loop { println!("Read start"); let n = reader.read(&mut buffer).await?; println!("Read end"); // 处理读取到的数据 }
异常现象
- 这段代码此前数月在多个连接场景下稳定运行,但连接位于纽约的新服务器后,会随机在数秒至数分钟后挂起,始终停在
read调用处——仅打印"Read start",不会输出"Read end"。 - 通过Wireshark抓包可见有数据包传入,但TCP接收窗口持续减小直至归零。
- 问题存在时序相关性:添加大量调试打印语句时,程序可运行更久甚至不出现挂起。
- 将
async-std::net::TcpStream替换为标准库的std::net::TcpStream后,一切正常。
连接差异
新旧连接仅存在网络路径差异:新连接为伦敦到纽约的直连,旧连接通过伦敦本地中继,数据类型与连接逻辑完全一致。
疑问与排查请求
请问这是否属于async-std的Bug?有哪些可行的后续排查思路?
内容的提问来源于stack exchange,提问作者musli
相关产品推荐
相关产品推荐

