2

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

这是我取出的失败的代码

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 来捕获错误,但没有返回任何内容

4

2 回答 2

5

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

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

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

于 2012-09-24T13:10:37.187 回答
1

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

如果线程是可连接的,则调用 std::terminate。销毁 *this。

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

于 2012-09-24T13:11:38.613 回答