我无法成功实现boost-asio多线程程序。
由于没有关于此的任何好的示例或文档, 我想要你的帮助:))
简单地说,我认为这段代码可以监听,但是当我想'cout'缓冲数据时, 它不会打印任何内容,也不会聆听一次并停止播放。
我的代码是:
void Worker::startThread(int clientNumber) {
cout << "listening: "<< clients[clientNumber]->port << endl;
boost::asio::io_service io_service;
tcp::acceptor acc(io_service, tcp::endpoint(tcp::v4(),portNumber[clientNumber]));
socket_ptr sock(new tcp::socket(io_service));
acc.accept(*sock);
try
{
for (;;) {
char data[max_length];
boost::system::error_code error;
cout << "message?" << endl;
size_t length = sock->read_some(boost::asio::buffer(data), error);
cout << "message :)" << endl;
cout << data << endl;
if(error == boost::asio::error::eof)
break; // Connection closed cleanly by peer.
else if (error)
throw boost::system::system_error(error); // Some other error.
}
}
catch (std::exception& e)
{
std::cerr << "Exception in thread: " << e.what() << "\n";
}
}
void Worker::start() {
cout << "Starting thread server" << endl;
for(int i=0; i<clients.size(); i++) {
boost::thread t(boost::bind(&Worker::startThread, this, i));
}
for(;;);
}
答案 0 :(得分:5)
如果您没有看到multi-threaded examples
,则很长时间没有查看文档HTTP Server 3
使用单个的HTTP服务器 io_service和一个线程池调用 io_service对象::运行()。
HTTP Server 2
使用的HTTP服务器 io_service-per-CPU design。
请记住这些示例使用异步方法,这是Boost.Asio库真正发挥作用的地方。
答案 1 :(得分:4)
您基本上已经复制了Blocking TCP Echo Server示例,但是您无法找到一个好的示例或文档?
无论如何,我发现您的代码存在一些问题:
clients[clientNumber]->port
听,但你正在听的实际端口是portNumber[clientNumber]
; data
之后和打印之前将read_some
归零; error == boost::asio::error::eof
条件为真(客户端断开连接),线程就会退出,因此您将无法(重新)连接该端口上的其他客户端;