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

新手上路,请多包涵

在用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
pic1.png
当发送上文代码块中请求时,为120s
pic2.png
请问在这个过程中,是POP3服务器本身有什么约定,还是我对tcpstream的使用方式出了问题呢?

阅读 2.1k
1 个回答
新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题