在使用 asio::async_read
来接收大量数据的时候,使用 transfer_at_least
来设定最少接收数据量,但是 asio
默
认的 transfer_at_least
实现每次最大读取 64k
, 这在传输大流量的时候,是极为不合适的,会极大的影响数据接收性能。
所以我们可以自己定制一个 transfer_at_least
来取代 asio
默认的 transfer_at_least
函数,实现如下:
static std::size_t custom_default_transfer_size = 1024 * 1024;
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 : custom_default_transfer_size;
}
private:
std::size_t minimum_;
};
inline transfer_at_least_t transfer_at_least(std::size_t minimum)
{
return transfer_at_least_t(minimum);
}
上面代码中 custom_default_transfer_size
设置为 1M 大小用于默认接收缓冲大小,此时在 asio::async_read
函数中 prepare
将分配最大为 1M 的内存空间用于数据接收。
Comments
blog comments powered by Disqus