【发布时间】:2020-04-17 17:27:32
【问题描述】:
我正在编写简单的同步 SMTP 和 POP3 客户端。问题在于读取服务器响应。它被正确读取,尽管它需要很长时间,比如一分钟。我查看了与wireshark 的通信并立即得到响应,但不知何故这条线正在节流(调试器检查)
boost::asio::read(socket, receiveBuffer, boost::asio::transfer_all(), 错误);
我做错了吗?你知道有什么解决办法吗?
【问题讨论】:
-
receiveBuffer是如何定义的? SMTP 是一种基于换行符的协议。您应该使用read_until重载,它需要分隔符来读取您需要的尽可能多的数据。 -
boost::asio::streambuf receiveBuffer;这是定义。 @rafix07 -
transfer_allforstreambuf两种情况下返回:64k字节数据被读取(这是单次操作读取数据的默认值),或者发生错误,例如第二面关闭连接,因此在这种情况下,您有一些以EOF为错误的读取数据。您对write的调用有效,因为write需要一些缓冲区并具有其长度,因此它知道必须发送多少字节。如果您不知道要读取多少数据,请使用read_until,直到\r\n序列出现在即将到来的数据中。 -
@rafix07 谢谢,它就像一个魅力!还有一个问题。我应该如何同步通信,我多次使用
boost::asio::write。我必须等待回复,但read_until()没有完成这项工作。如何保持同步?现在看来我是在不给他时间思考的情况下向服务器射击。 -
好的,它有效。我使用
read_until的次数太多了。
标签: c++ sockets tcp network-programming boost-asio