【问题标题】:asio::read() takes really long time, no proble with asio::writeasio::read() 需要很长时间,asio::write 没问题
【发布时间】: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_all for streambuf 两种情况下返回:64k字节数据被读取(这是单次操作读取数据的默认值),或者发生错误,例如第二面关闭连接,因此在这种情况下,您有一些以EOF 为错误的读取数据。您对write 的调用有效,因为write 需要一些缓冲区并具有其长度,因此它知道必须发送多少字节。如果您不知道要读取多少数据,请使用read_until,直到\r\n 序列出现在即将到来的数据中。
  • @rafix07 谢谢,它就像一个魅力!还有一个问题。我应该如何同步通信,我多次使用boost::asio::write。我必须等待回复,但read_until() 没有完成这项工作。如何保持同步?现在看来我是在不给他时间思考的情况下向服务器射击。
  • 好的,它有效。我使用read_until 的次数太多了。

标签: c++ sockets tcp network-programming boost-asio


【解决方案1】:

transfer_all for streambuf 在两种情况下返回:读取了 64k 字节的数据(这是单次操作读取数据的默认值),或者发生错误,例如第二侧关闭连接,结果在这种情况下,您有一些以EOF 为错误的读取数据。您对write 的调用有效,因为write 需要一些缓冲区并具有其长度,因此它知道必须发送多少字节。如果您不知道要读取多少数据,请使用read_until,直到 \r\n 序列出现在即将到来的数据中。

@rafix07

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多