首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用gio.lookup_by_address

使用gio.lookup_by_address
EN

Stack Overflow用户
提问于 2021-03-13 22:07:29
回答 2查看 77关注 0票数 0

大部分代码都是借来的,JS不是我的方式,但需要创建一个扩展。

您能告诉我如何在给定的代码中使用g_resolver_lookup_by_name()返回IP吗?

g-resolver-lookup-by-name

代码语言:javascript
复制
const Main = imports.ui.main;
const St = imports.gi.St;
const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Me = imports.misc.extensionUtils.getCurrentExtension();

let myPopup;

const MyPopup = GObject.registerClass(
class MyPopup extends PanelMenu.Button {

  _init () {
    super._init(0);
 ...
    this.menu.addMenuItem(
      new PopupMenu.PopupMenuItem(
        "Some : ", // IP is required to be returned
        {reactive : false},
      )
    );    
  }
});
...

Gio.Resolver.lookup_by_name('google.com') - TypeError: Gio.Resolver.lookup_by_name不是函数

EN

回答 2

Stack Overflow用户

发布于 2021-03-14 05:24:02

您试图调用一个方法,就好像它是静态的一样,但您首先需要获得默认的解析器:

代码语言:javascript
复制
const Gio = imports.gi.Gio;

// The default resolver
const resolver = Gio.Resolver.get_default();

查找名称肯定会阻塞I/O,因此在Shell扩展中使用异步变体是必要的。promise包装器可能是最好的:

代码语言:javascript
复制
function lookupName(host, cancellable = null) {
    return new Promise((resolve, reject) => {
        resolver.lookup_by_name_async(host, cancellable, (obj, res) => {
            try {
                resolve(resolver.lookup_by_name_finish(res));
            } catch (e) {
                reject(e);
            }
        });
    });
}

当然,正如文档所述,这将返回一个Gio.InetAddress对象列表,您必须调用to_string()才能获得一个可读地址。

票数 1
EN

Stack Overflow用户

发布于 2021-05-26 01:49:44

补充一下上面的答案:您实际上不再需要实现promise包装器。GJS有一个内置函数,可以让异步方法返回一个promise。

在您的分机中,您可以确定与主机名匹配的地址,如下所示:

  1. 使lookup_by_name_async方法返回一个Promise

代码语言:javascript
复制
Gio._promisify(Gio.Resolver.prototype, 'lookup_by_name_async', 'lookup_by_name_finish');

  1. 在扩展中初始化解析器(可能在enable()函数中的某个位置)。

代码语言:javascript
复制
const resolver = Gio.Resolver.get_default();

  1. 定义一个异步函数来查找与主机名匹配的地址,并将其作为字符串数组返回

代码语言:javascript
复制
async function lookupHostName(resolver, hostname, cancellable=null){
    let inetAddressList = await resolver.lookup_by_name_async(hostname, null);
    let addressesAsStrings = inetAddressList.map(address => address.to_string());
    return addressesAsStrings;
}

  1. 在需要的地方调用函数并使用addresses

代码语言:javascript
复制
lookupHostName(resolver, "localhost").then(ipAddresses => {
        log(JSON.stringify(ipAddresses));
    });

在您的日志中,您应该会看到类似以下内容:

代码语言:javascript
复制
["::1","127.0.0.1"]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66614428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档