提升asio tcp服务器

bir*_*ney 2 c++ sockets boost boost-asio

我目前一直在努力尝试它.当我尝试制作一个简单的多线程echo服务器时,它会在接收到错误代码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);
    }
Run Code Online (Sandbox Code Playgroud)

}

我可以使用netcat连接到它很好,它收到欢迎消息,但是当它接收它崩溃时.我试过在每一个上使用boost :: system :: error_code捕获错误但没有返回任何内容

PSI*_*Alt 5

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

  1. 创建boost::thread对象t然后立即退出范围.这会使线程脱离,现在无法控制; 或者,正如Joachim Pileborg提到的,它可以终止(我不太熟悉boost :: threads,所以如果我错了,请纠正我).
  2. 在此之后你开始新的接受者.每个侦听端口只能容纳1个接受器.
  3. 没有必要为此创建线程,它是ASIO,使用async;)
  4. receive 不等待数据,它只是获取ASIO已经拥有的数据包数据(在这种情况下不正确)

检查boost站点的示例,我认为您的情况是阻止tcp echo服务器