提升 ASIO TCP 服务器

boost asio tcp server

本文关键字:服务器 TCP ASIO 提升      更新时间:2023-10-16

我目前正在尝试boost。当我尝试制作一个简单的多线程回显服务器时,它会在收到错误代码 3 时退出。我已经多次查看了文档,但仍然没有运气。我知道这可能是我忽略的非常简单的事情。我对 winsock 有不错的经验,但我想学习提升库。

这是我取出的失败代码

typedef boost::shared_ptr<tcp::socket> socket_ptr;
boost::asio::io_service io;
boost::array<char, 512> buf;
void startserver ( std::string host, std::string port )
{
    tcp::acceptor a (io, tcp::endpoint(tcp::v4(), atoi(port.c_str())));
    for(;;)
    {
        socket_ptr sock (new tcp::socket(io));
        a.accept(*sock);
        std::cout << sock->remote_endpoint() << std::endl;
        boost::thread t (boost::bind(session, sock));
     }
}
void session ( socket_ptr sock ) 
{
    sock->send(boost::asio::buffer("welcome"),0,er);
    size_t len;
    for(;;)
    {
        len = sock->receive(boost::asio::buffer(buf));
        sock->send(boost::asio::buffer(buf,len),0,er);
    }

}

我可以使用netcat很好地连接到它,它会收到欢迎消息,但是当它收到它时,它会崩溃。我尝试在每个系统上使用 boost::system::error_code 捕获错误,但没有任何返回

问题太多了。查看 asio 文档以获取正确的示例。一些问题:

  1. 创建boost::thread对象t,然后立即退出作用域。这断开了线程,现在无法控制;或者,如前所述,Joachim Pileborg可以终止(我不太熟悉boost::threads,所以如果我错了,请纠正我)。
  2. 在此之后,您开始新的接受器。每个侦听端口应仅保留 1 个接收器。
  3. 为此
  4. 创建线程根本没有意义,它是 ASIO,使用异步;)
  5. receive 不等待数据,它只是获取 ASIO 已经拥有的数据包数据(在这种情况下并非如此)

在提升站点查看示例,我认为您的情况正在阻止TCP echo服务器

这很可能是因为线程超出了范围。从boost::thread析构函数的手册页:

如果线程是可连接的,则调用 std::endinate。破坏*这个。

这意味着当线程启动时,它可能会运行一段时间,然后 startserver 中的线程再次获得控制权,线程对象被破坏并且线程被终止。