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++ asio async\u accept总是发生错误,错误代码.value()为22,这意味着参数无效_C++_Sockets_Boost_Boost Asio - Fatal编程技术网

C++ asio async\u accept总是发生错误,错误代码.value()为22,这意味着参数无效

C++ asio async\u accept总是发生错误,错误代码.value()为22,这意味着参数无效,c++,sockets,boost,boost-asio,C++,Sockets,Boost,Boost Asio,我已经使用boost::asio,共有8个线程 boost::asio::io_service ios; boost::asio::ip::tcp::acceptor(ios); boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port); acceptor.open(endpoint.protocol()); acceptor.set_option(boost::asio::ip::tcp::accep

我已经使用boost::asio,共有8个线程

boost::asio::io_service ios;


boost::asio::ip::tcp::acceptor(ios);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), port);
acceptor.open(endpoint.protocol());
acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
acceptor.listen();

LocalTcpServer::getInstance()->initialize(ios, acceptor, pool);

boost::thread_group th_group;
for(i=0; i< 8; i++)
th_group.add_thread(new boost::thread(boost::bind(&boost::asio::io_service::run, &ios)));
th_group.join_all();





session::start()
{
    socket.async_read_some(boost::asio::buffer(buffer), m_strand.wrap(boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)))
}
session::handleread(boost::system::error_code &e, size_t byteTrans)
{
    if(e || byteTrans == 0 )
    {
         socket.shutdown(...)
         //socketRelease close the socket and delete this
         timeInfo->timer->async_wait(boost::bind(socketRelease(), ...);
    }
    else
    {
       //deal with data whit pool;  
    }

    socket.async_read_some(.....);
}









LocaltcpServer::initialize(ios, acceptor, pool){ 
   //init, pool is inherit from threadpool, used in handle read to deal with     receive data
   ...; 
   startaccept(); 
}
LocalTcpServer::Accept()
{
     session* pSession = new session(acceptor->get_io_service, pool);
     acceptor.async_accept(session->socket, boost::bind(handle_accept, this, pSession, boost::asio::placeholder::error))
}

LocalTcpServer::handle_accept(boost::system::error_code& e; ... );
{
    if(e)
    {
        //when app run sometime(serveral hours or days, e has always error 22, means invalid argument )
        LOG_ERROR << e.message() << e.value();
        delete newSession;
        accept();
    }
    else
    {
         session.start();
         accept();
    }
}
boost::asio::io\u服务ios;
boost::asio::ip::tcp::acceptor(ios);
boost::asio::ip::tcp::endpoint端点(boost::asio::ip::tcp::v4(),端口);
acceptor.open(endpoint.protocol());
set_选项(boost::asio::ip::tcp::acceptor::reuse_address(true));
接受者。听();
LocalTcpServer::getInstance()->初始化(ios、接受器、池);
boost::线程组th组;
对于(i=0;i<8;i++)
添加线程(新的boost::线程(boost::bind(&boost::asio::io_服务::run,&ios));
第四组。加入所有人();
会话::开始()
{
socket.async_read_some(boost::asio::buffer(buffer),m_strand.wrap(boost::bind(&session::handle_read,this,boost::asio::placeholders::error,boost::asio::placeholders::bytes_transfer)))
}
session::handleread(boost::system::error\u code&e,size\u t byterans)
{
if(e | | byterans==0)
{
socket.shutdown(…)
//socketRelease关闭套接字并删除此
timeInfo->timer->async_wait(boost::bind(socketRelease(),…);
}
其他的
{
//数据池处理;
}
socket.async_read_some(…);
}
LocaltcpServer::初始化(ios、接受器、池){
//初始化时,池继承自threadpool,在句柄读取中用于处理接收数据
...; 
startacept();
}
LocalTcpServer::Accept()
{
会话*pSession=新会话(接受者->获取io服务,池);
acceptor.async_accept(会话->套接字,boost::bind(handle_accept,this,pSession,boost::asio::placeholder::error))
}
LocalTcpServer::handle\u accept(boost::system::error\u code&e;…);
{
如果(e)
{
//应用程序运行时(数小时或数天,e始终出现错误22,表示参数无效)

LOG_ERROR如果侦听套接字也失败,则主要怀疑对象之一是dhcp。接口的ip地址可能已更改


在这种情况下,绑定到该接口的所有打开的套接字都将无效,必须关闭,包括侦听套接字,然后必须使用新套接字重新启动侦听。

does
m_strand.wrap()
将回调封装在一个线程中?出于某种原因,对于一个库来说,8个线程听起来很合适,它可以在一个线程上处理50k个连接,而不会降低性能。asio例程应该与io_service::run()从同一个线程运行;我认为您遇到了某种竞争条件。很难说错误来自何处……如果侦听套接字也失败,则主要怀疑之一是dhcp。接口的ip地址可能已更改。在这种情况下,绑定到该接口的所有打开的套接字都将无效,必须关闭,包括侦听套接字,然后必须使用新套接字重新启动侦听。我发现,当出现错误ocurr时,侦听将消失。例如,我使用netstat-nat | grep 1234显示连接,没有侦听行,该行的本地地址是127.0.0.1:1234,状态是listen。但是,当它正确运行时,您可以看到该行。但是之前建立了一些连接,一段时间后,连接减少到零。我很好奇为什么监听消失了?如果我创建了一个新的接收器来监听,它能工作吗??