语言/QT {QHostInfo(域名转IP地址)}
QHostInfo(域名转IP地址)
定义
需求: 根据域名 查询他的IP地址;
每一次查询 他都是一个网络通讯的过程(即去查询远程DNS服务器), 这一次查询 就是一个QHostInfo
对象;
方式0(堵塞方式): QHostInfo ret = QHostInfo::fromName("域名");
, 这是堵塞方式 即只有当DNS服务器返回过来结果ret
后 你程序才能运行;
方式1(异步方式): int id = QHostInfo::lookupHost( ui->lineEdit_port->text(), this, [&]( const QHostInfo & _ret){}};
, 这就很像是一个信号与槽, 即你程序会正常运行 当DNS服务器返回过来结果后 他就会调用你的第三个参数(槽函数), 结果在_ret
里面; 这个函数返回值id
表示此时后台有一个ID=id的QHostInfo
他正在运行(即给远程DNS发送查询 然后等待服务器的返回结果), QHostInfo
内部 他肯定会保证 你所有的查询(即QHostInfo
对象) 他们的id
号是不同的; 假如很长时间都没反应 那么你可以调用QHostInfo::abortHostLookup(id)
来中止他;
性质
fromName(), lookupHost()
的参数 通常我们都放域名, 即根据域名来查询IP地址;
其实你放入IP地址 也可以; 比如fromName( "127.0.0.1")
他的结果里的hostName()
会是你的主机名;
@DELI;
hostName
虽然翻译是主机名, 其实他表示的是域名(即www.baidu.com
);
代码
多重集合<int> S;
//> 查询
int id = QHostInfo::lookupHost( "域名", this, [&]( const QHostInfo & _ret){
if( S.find( _ret.lookupId()) == S.end()){ 报警(异常);}
S.erase( S.find( _ret.lookupId()));
if( _ret.error() == QHostInfo::NoError){
`_ret.hostName()`域名的IP地址是 `_ret.addresses()`;
}
else{
报警( 查询域名`_ret.hostName()`失败, _ret.error(), _ret.errorString());
}
});
//> 中止(后台正在进行查询的任务 都终止把);
for( auto id : S){ QHostInfo::abortHostLookup( id);}