【问题标题】:Firefox addon sdk get client ip return wrong formatFirefox插件sdk获取客户端IP返回错误格式
【发布时间】:2014-04-16 18:59:24
【问题描述】:
var dns = Cc["@mozilla.org/network/dns-service;1"].getService(Ci.nsIDNSService);                         
var myName = dns.myHostName;
var record = dns.resolve(myName, 0);
while (record && record.hasMore()){
    console.log(record.getNextAddrAsString())
}

它返回“2001:0:9d38:6abd:248d:2ee4:3f57:fd26”(255.255.255.255 子网掩码)。如何获得IP4。 非常感谢。

【问题讨论】:

  • 看起来它正在返回一个 IPv6,所以你需要以某种方式转换回人类可读的点状 IP。
  • 但我想要 ip4。谢谢
  • 我刚才给你的例子是下面答案中的 IPv4...long2ip() 将 longip 转换为 IPv4 IP。
  • 这个解决方案是错误的。您应该改为正确实施 IPv6。

标签: firefox firefox-addon firefox-addon-sdk gecko


【解决方案1】:

我觉得格式没问题;我看到了 IPv6 和 IPv4 地址的控制台输出。

如果要将输出限制为仅 IPv4 地址,可以将 RESOLVE_DISABLE_IPV6 标志传递给解析函数。

var dns = Cc["@mozilla.org/network/dns-service;1"].getService(Ci.nsIDNSService);                         
var myName = dns.myHostName;
var record = dns.resolve(myName, Ci.nsIDNSService.RESOLVE_DISABLE_IPV6);
while (record && record.hasMore()){
    console.log(record.getNextAddrAsString())
}

【讨论】:

  • record.getNextAddrAsString();record.getNextAddrAsString();两次是ip4。这对我有用
【解决方案2】:

你需要做“createInstance”而不是“getService”

var {Cc, Ci} = require("chrome"); //必须这样做

var dns = Cc["@mozilla.org/network/dns-service;1"].createInstance(Ci.nsIDNSService);

var myName = dns.myHostName;

var nsrecord = dns.resolve(myName, 0); //解析主机名

while (nsrecord && nsrecord.hasMore()){ console.log("IP address: " + nsrecord.getNextAddrAsString());} //记录到控制台

【讨论】:

    【解决方案3】:

    不幸的是,我不知道如何在 JavaScript 中执行此操作,但假设我们遵循 IPv6 地址的标准,我想出了这个

    function ipv62long( $chrp ) {
        $chr = '';
        foreach ( unpack('C*', inet_pton( $chrp ) ) as $byte ) {
            $chr .= str_pad( decbin( $byte ), 8, "0", STR_PAD_LEFT );
        }
        return base_convert( ltrim($chr, '0' ), 2, 10 );
    }
    
    $chrp = ipv62long('2001:0:9d38:6abd:248d:2ee4:3f57:fd26');
    echo $chrp;
    echo '<p>' . long2ip( $chrp ) . '</p>';
    

    再次,不确定 JavaScript,但如果您可以与此脚本通信,您可以轻松地为其提供 IPv6 并让它返回人类可读的 IP。

    function ipv62long( $chrp ) {
        $chr = '';
        foreach ( unpack('C*', inet_pton( $chrp ) ) as $byte ) {
            $chr .= str_pad( decbin( $byte ), 8, "0", STR_PAD_LEFT );
        }
        return base_convert( ltrim($chr, '0' ), 2, 10 );
    }
    
    $chrp = ipv62long( urldecode( $_GET['v6'] ) );
    echo "{'ip': '" . long2ip( $chrp ) . "'}"; // Return a JSON response
    

    我们收到了一个 URI 查询的响应,例如 ipv6.php?v6=2001%3a0%3a9d38%3a6abd%3a248d%3a2ee4%3a3f57%3afd26,其中包含为 URL 编码的 IP。

    【讨论】:

      猜你喜欢
      • 2020-04-06
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 2012-09-25
      • 2013-10-16
      • 2014-10-06
      • 2019-01-14
      相关资源
      最近更新 更多