当前位置: 首页 > 工具软件 > asio2 > 使用案例 >

用asio2如何实现网络限速

干高歌
2023-12-01

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();

最后编辑于:2023-03-30

 类似资料: