面向上司编程 2020-09-07 14:43 采纳率: 0%
浏览 90

asio 异步TCP客户端,切换ip失败

编写了一个异步TCP程序,目标服务器可能有多个,使用过程中需要切换ip,但是却无法进行切换ip进行连接。省略了部分代码,关键代码如下:

//首先关闭旧连接
    m_clientSocket->shutdown( asio::ip::tcp::socket::shutdown_both, ec );
    m_clientSocket->close();
//然后关闭事件循环
m_ioService.stop();

    std::thread::id threadId = std::this_thread::get_id();
    for ( auto& worker : m_workerThreads )
    {
        if ( ( threadId != worker.get_id() ) && worker.joinable() )
        {
            worker.join();
        }
    }

//切换服务器ip和端口
                m_serverIp = svrIp;
        m_serverPort = std::to_string(svrPort);
        asio::ip::tcp::resolver resolver_( m_ioService );
        //域名或ip/port解析
        asio::ip::tcp::resolver::query query( m_serverIp /*域名 or ip*/, m_serverPort/*服务(协议) or port*/ );
        m_serverEndpoints = resolver_.resolve( query );

//进行连接
                        std::vector< std::string >::iterator iter;
                        //....
                        asio::ip::tcp::endpoint end_point( asio::ip::address::from_string( *iter ), 0 );
            m_clientSocket->open( end_point.protocol(), ec );
            if ( ec )
            {

                iter++;
                continue;
            }

            m_clientSocket->set_option( asio::socket_base::reuse_address() );
            m_clientSocket->bind( end_point );
            if ( ec )
            {

                iter++;
                continue;
            }
            //建立连接(同步)
            m_clientSocket->connect( *epIter, ec );

            //每次的切换IP结果都是sock是无法打开的
             //连接断开
    if ( !( m_clientSocket->is_open() ) )//如果成功会打开。
    {
                //切换ip的结果 open error

        }

        //重新开启事件循环
        m_workerThreads.clear();
    // 创建、启动io_service线程      emplace_back会调用构造函数。所以自动会构造一个线程。
    m_workerThreads.emplace_back( [ this ](){
        m_ioService.reset();
        m_ioService.run();
    } );

  • 写回答

1条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?