Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost-asio-tcp服务器_C++_Sockets_Boost_Boost Asio - Fatal编程技术网

C++ boost-asio-tcp服务器

C++ boost-asio-tcp服务器,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,我最近一直在和boost混在一起尝试它。当我尝试创建一个简单的多线程echo服务器时,它在接收时退出,错误代码为3。我已经看了很多次文档,但仍然没有运气。我知道这可能是我忽略的一件非常简单的事情。我在winsock方面有丰富的经验,但我想学习boost库 这是失败的代码我拿出了 typedef boost::shared_ptr<tcp::socket> socket_ptr; boost::asio::io_service io; boost::array<char, 512

我最近一直在和boost混在一起尝试它。当我尝试创建一个简单的多线程echo服务器时,它在接收时退出,错误代码为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);
    }
typedef boost::共享\u ptr套接字\u ptr;
boost::asio::io_服务io;
boost::阵列buf;
void startserver(std::string主机,std::string端口)
{
tcp::acceptor a(io、tcp::endpoint(tcp::v4()、atoi(port.c_str()));
对于(;;)
{
socket_ptr sock(新的tcp::socket(io));
a、 接受(*袜子);
std::cout remote_endpoint()send(boost::asio::buffer(“欢迎”),0,er);
尺寸透镜;
对于(;;)
{
len=sock->receive(boost::asio::buffer(buf));
sock->send(boost::asio::buffer(buf,len),0,er);
}
}


我可以用netcat很好地连接到它,它接收到欢迎消息,但当它接收到它时就崩溃了。我尝试在每个消息上使用boost::system::error_代码捕捉错误,但没有返回任何消息。问题太多。请查看asio文档以获取正确的示例。一些问题:

  • 创建
    boost::thread
    object
    t
    ,然后立即退出作用域。这会解除线程的连接,现在它是不可控制的;或者,正如前面提到的Joachim Pileborg它可以终止(我对boost::threads不太熟悉,如果我错了,请纠正我)
  • 在此之后,您将启动一个新的接收器。每个侦听端口应仅保留一个接收器
  • 根本没有必要为此创建线程,它是ASIO,请使用async;)
  • receive
    不等待数据,它只获取已经存在的数据包数据(在这种情况下是不正确的)

  • 查看boost站点上的示例,我认为您的情况是

    这很可能是因为线程超出了范围

    如果线程是可连接的,那么对std::terminate.destroy的调用会破坏*这个


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

    您的函数startserver将产生大量线程,顺便说一句,请注意。我尝试调用io.run()但它也做了同样的事情…@DenisErmolin我认为accept()就像winsock上的阻塞一样,所以它只会根据需要创建线程?