【问题标题】:Boost-Asio , multi-thread tcp serverBoost-Asio , 多线程 tcp 服务器
【发布时间】:2011-01-28 08:56:26
【问题描述】:

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

【问题讨论】:

    标签: c++ boost tcp boost-asio


    【解决方案1】:

    如果你没有看到multi-threaded examples,你就没有看文档很长时间

    HTTP 服务器 3

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


    HTTP 服务器 2

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

    请记住,这些示例使用异步方法,这是 Boost.Asio 库的真正亮点。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 感谢回复,clients[clientNumber]->port 和 portNumber[clientNumber] 的值相同。我的意思是,在收听时,我可以从相关端口一次从客户端获取消息,因此,客户端无法传递进一步的消息。 [例外:连接被拒绝]
      • 我已经删除了该行,但在这种情况下,不是消息(每 1 分钟出现一次),而是每 ~0.5 秒出现一些垃圾字符
      • 你的例子完整吗?从外观上看,您没有运行 io_service?
      • @Andre 仅使用同步方法时,您不需要运行 io_service。
      • @darkalive:想想服务器端的 TCP 操作是什么(尤其是监听和接受部分),在这些操作期间创建了哪些套接字,原始示例何时创建线程,为什么使用示例shared_ptr 持有 sock 虽然它是局部变量...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多