编写了一个异步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();
} );