繁体   English   中英

Boost-Asio多线程TCP服务器

[英]Boost-Asio , multi-thread tcp server

我无法成功完成boost-asio多线程程序。

由于没有关于此的任何好的示例或文档,我需要您的帮助:)

简而言之,我认为这段代码确实可以监听,但是当我想“缓存”缓冲区数据时,它不会打印任何内容,也不会监听一次并停止。

我的代码是:

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

如果您没有看到多线程示例,那么您没有看很长时间的文档

HTTP服务器3

使用单个io_service和调用io_service :: run()的线程池的HTTP服务器。


HTTP服务器2

使用io_service-per-CPU设计的HTTP服务器。

请记住,这些示例使用异步方法,这是Boost.Asio库真正发挥作用的地方。

您基本上已经复制了Blocking TCP Echo Server示例,但找不到合适的示例或文档?

无论如何,我发现您的代码存在一些问题:

  • 您说的是在clients[clientNumber]->port监听,但您正在监听的实际端口是portNumber[clientNumber]
  • read_some之后和打印之前,您需要对data进行零终止data
  • error == boost::asio::error::eof条件为真(客户端断开连接)时,线程将退出,因此您将无法(重新)连接该端口上的另一个客户端;
  • 您只接受第一个连接/客户端,在同一端口上连接的所有其他客户端都不会以任何方式处理其消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM