asio2框架实现了网络速度限制功能,使用起来很简单(可以参考example文件夹的示例:/asio2/example/rate_limit/rate_limit.cpp):
#define ASIO2_INCLUDE_RATE_LIMIT
asio2::tcp_rate_server tcp_server;
tcp_server.bind_connect([](std::shared_ptr<asio2::tcp_rate_session>& session_ptr)
{
// 针对每个连接,你可以设置不同的速度限制
// 可以只设置发送速度,不设置接收速度,等等,如果没有下面的设置的话,默认是不限速
// 设置发送速度 这里256是指每秒发送256个字节 以下同理
session_ptr->socket().rate_policy().write_limit(256);
// 设置接收速度
session_ptr->socket().rate_policy().read_limit(256);
}).bind_recv([](auto& session_ptr, std::string_view data)
{
printf("recv : %zu %.*s\n", data.size(), (int)data.size(), data.data());
session_ptr->async_send(data);
});
tcp_server.start("0.0.0.0", 8102);
asio2::tcp_rate_client tcp_client;
tcp_client.bind_connect([&tcp_client]()
{
// 设置发送速度
tcp_client.socket().rate_policy().write_limit(512);
// 设置接收速度
tcp_client.socket().rate_policy().read_limit(512);
if (!asio2::get_last_error())
{
std::string str;
for (int i = 0; i < 1024; i++)
{
str += '0' + std::rand() % 64;
}
tcp_client.async_send(str);
}
}).bind_recv([&tcp_client](std::string_view data)
{
tcp_client.async_send(data);
});
tcp_client.start("127.0.0.1", 8102);
std::thread([&tcp_client]()
{
// 注意:如果是在其它线程中设置限速的话,最好用post投递一个事件,这样确保
// 设置速度的函数是在io_context 线程中调用的,确保线程安全
tcp_client.post([&tcp_client]()
{
tcp_client.socket().rate_policy().read_limit(512);
});
}).detach();