POP3协议服务器的应答时间很长为什么?

发布于 2022-09-12 03:38:59 字数 928 浏览 24 评论 0

在用rust写一个简单的POP3客户端,测试用的是126/163邮箱(qq邮箱貌似必须用SSL),但是在一开始就出问题了:无论向服务器发送user xxx@126.com还是其他格式不正确的请求,都需要经过很长的时间(120s/150s)才能得到应答;并且后续再发送请求时就没有应答了。
代码如下:

let mut connection = TcpStream::connect(("pop.126.com", 110)).unwrap();
connection.write(b"user 114514@126.com\r\n");
let mut result = String::new();
connection.read_to_string(&mut result);
println!("{:?}", result);

测量read_to_string的运行时间如下:
当发送不正确请求时,为150s
https://www.wenjiangs.com/wp-content/uploads/stackoverflow/202204/pic1.png
当发送上文代码块中请求时,为120s
https://www.wenjiangs.com/wp-content/uploads/stackoverflow/202204/pic2.png
请问在这个过程中,是POP3服务器本身有什么约定,还是我对tcpstream的使用方式出了问题呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

∞琼窗梦回ˉ 2022-09-19 03:38:59

解决以后自问自答一发,read_to_string和io里其他不使用缓冲区的read方法都差不多,只能以EOF为结束符,而连接关闭的时候才有EOF,中间的信息都是用rn作为分隔的,因此连接成功时的信息(+OK Welcome...)和noop/user命令的应答(+OK core mail/+ERR Command...)就连在一起,只有连接因为超时关闭时才能成功读出来。
要想使用rn进行分隔可以用BufReader读。为什么不直接在std::net里放一个read_line一类的方法呢?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文