On Thu, Feb 12, 2009 at 10:16 PM, Igor R <boost.lists@gmail.com> wrote:
Is transfer_at_least supposed to return success only if requested number of bytes transferred at once or at all?

http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/reference/transfer_at_least.html
"Return a completion condition function object that indicates that a read or write operation *should continue until* a minimum number of bytes has been transferred, or until an error occurs."

 
For example, I want to receive 800 bytes and put them into streambuf using transfer_at_least(800) as completion condition, but I receive 2 chunks of 400 bytes, therefore I never get a success, because transfer_at_least_t always wants more data.

When 800 bytes are received (at once or by chunks) or error occurs, the completion handler is invoked - that's the effect of this completion condition. If you encounter different behaviour, could you please provide minimal code demonstrating this?
Yes, exactly. Code snippet may be uselese, but I'm using something like this:
boost::asio::read(sock, buf, boost::asio::transfer_at_least(800), myhandler);

and myhandler is never called (because no more data arrives).

From implementation:
class transfer_at_least_t
{
public:
  typedef std::size_t result_type;

  explicit transfer_at_least_t(std::size_t minimum)
    : minimum_(minimum)
  {
  }

  template <typename Error>
  std::size_t operator()(const Error& err, std::size_t bytes_transferred)
  {
    return (!!err || bytes_transferred >= minimum_)
    ? 0 : default_max_transfer_size;
  }

private:
  std::size_t minimum_;
};

This handler called after each read operation and bytes_transferred each time is 400, but minimum_ is 800.


_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users