增强asio网络独立发送和接收
Boost asio networking separate send and receive
- 服务器可以随时向客户端发送数据。和中一样,服务器包含另一个类可能调用的某种发送函数
- 服务器永远异步读取
- 客户也是如此
我对boost::asio中的人际网络还相当陌生。我理解TCP异步服务器和客户端上的示例,但这些都是echo客户端/服务器。如果服务器接收到数据,它将立即发回。但我需要服务器接收数据,为另一个类做一些其他操作,然后发送给特定的客户端(服务器将有多个客户端连接到它)。并且该发送可以在1秒之后或者任何给定的时间量之后。
在使用GNU库的套接字编程中,我已经实现了这一点。服务器中有一个线程用于侦听,另一个线程则用于发送。客户端也是如此。我已经研究过这种方法:Asio,但就是不知道如何实现它。谁能指出正确的方向?
全双工套接字不需要多个线程。事实上,如果你不这样做会更容易。
如果有多个线程,则必须使用一个链来协调套接字上的所有异步操作。
除此之外,它实际上只是这么简单:
最简单的例子:
在Coliru上直播
#include <boost/asio.hpp>
#include <memory>
#include <iostream>
namespace io = boost::asio;
using tcp = io::ip::tcp;
using boost::system::error_code;
struct session : std::enable_shared_from_this<session> {
session(io::io_service& svc) : _sock(svc), _tim(svc) {}
void run() {
ping_loop();
receive_loop();
}
private:
friend class server;
tcp::socket _sock;
io::deadline_timer _tim;
io::streambuf _buf;
void receive_loop() {
auto This = shared_from_this();
io::async_read_until(_sock, _buf, "n", [This,this](error_code ec, size_t) {
if (ec)
std::cerr << "Receive error: " << ec.message() << "n";
else {
std::cout << "Received '" << &_buf << "'n";
// chain
receive_loop();
}
});
}
std::string _ping = "pingn";
void ping_loop() {
_tim.expires_from_now(boost::posix_time::millisec(100));
auto This = shared_from_this();
_tim.async_wait([This,this](error_code ec) {
if (!ec) {
io::async_write(_sock, io::buffer(_ping), [This,this](error_code,size_t) {});
// chain
ping_loop();
}
});
}
};
class server {
public:
void start() {
_acc.bind({ io::ip::address_v4{}, 6768 });
_acc.listen(5);
accept_loop();
_svc.run(); // TODO thread? shutdown?
}
private:
void accept_loop() {
auto sess = std::make_shared<session>(_svc);
_acc.async_accept(sess->_sock, [this,sess](error_code ec){
if (ec) {
std::cerr << "Accept error: " << ec.message() << "n";
} else {
sess->run();
// chain
accept_loop();
}
});
}
io::io_service _svc;
tcp::acceptor _acc { _svc, tcp::v4() };
};
int main() {
server s;
s.start();
}
当运行这样的客户端时:
while sleep 1; do date; done | nc localhost 6767
服务器输出,如:
Received 'Thu Nov 12 10:24:08 CET 2015
'
Received 'Thu Nov 12 10:24:09 CET 2015
'
Received 'Thu Nov 12 10:24:10 CET 2015
'
Received 'Thu Nov 12 10:24:11 CET 2015
'
Received 'Thu Nov 12 10:24:12 CET 2015
'
Received 'Thu Nov 12 10:24:13 CET 2015
'
Received 'Thu Nov 12 10:24:14 CET 2015
'
Received 'Thu Nov 12 10:24:15 CET 2015
'
Receive error: End of file
当客户端收到连续时
ping
ping
...
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 我的神经网络不起作用 [XOR 问题]
- 在网络套接字计时器滴答后增加asio短读错误
- 如何使用boost::asio从网络中断中恢复
- 如何将 Boost::ASIO 与用户空间网络堆栈集成?
- Boost Asio网络发送/接收是否具有任何形式的数据完整性保证
- 使用 Boost.Asio 将 UDP 套接字绑定到特定网络接口
- 使用Boost.ASIO与服务器进行简单的网络tcp通信
- 我可以使用Boost::Asio而不用担心网络编程问题吗?
- boost.asio和目前的网络TS之间最大的区别是什么
- 使用 boost::asio 和 std::wstring 解析网络节点
- ASIO 客户端服务器在同一台 PC 上连接正常,但在本地网络上出现故障
- 来自 boost::asio::async_write 的 WriteHandler 在连接断开时无法正常工作(防火墙/手动断开网络)
- 无法独占绑定到具有加速 asio 的网络端口
- C++网络程序设计:Boost Asio、Serialization和OStream
- 使用Asio(Boost)通过网络发送灵活的数据量
- Boost-Asio:如何处理来自控制台和网络的流数据
- 增强asio网络独立发送和接收
- 同一网络中两台计算机之间的客户端-服务器应用程序(使用boost::asio)
- mmorpg服务器端的网络库(libuv/boost::asio?)