可移植的本机客户端解析主机时权限被拒绝

 cmm雨轩 发布于 2023-02-10 14:25

我正在编写一个小应用程序来测试和理解PNaCl.

该应用程序的目的是使用PNaCl框架中的HostResolver类将主机名解析为主机的ip .代码似乎工作正常,但我得到一个访问被拒绝错误(返回值-7)因为我没有向用户请求访问套接字层(我猜)的权限.问题是我不知道该怎么做.我试着写一个清单文件,但什么都没发生.

注意:此应用程序必须在开放的Web上运行,并且不能要求任何安装过程.我不想写Chrome应用.

我没有在网上找到任何线索所以我将非常感谢你的帮助.

hello_tuttorial.cc:

#include 
#include 
#include 


#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/var.h"
#include "ppapi/cpp/tcp_socket.h"
#include "ppapi/cpp/host_resolver.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/tcp_socket.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/utility/completion_callback_factory.h"


namespace {
  // exptected string from the browser 
  const char * const kHelloString = "hello"; 
  // the sting sent from the nacl module to the browser
  const char * const kReplyString ="hello from the PNaCl"; 
} 


class HelloTutorialInstance : public pp::Instance {

  pp::CompletionCallbackFactory callback_factory_;
  pp::TCPSocket tcp_socket_;
  pp::HostResolver resolver_;

 public:
  explicit HelloTutorialInstance(PP_Instance instance) : pp::Instance(instance),
      callback_factory_(this)
      {}

  virtual ~HelloTutorialInstance() {}

  virtual void HandleMessage(const pp::Var& var_message) { 
    if (!var_message.is_string())
      return; 

    std::string message = var_message.AsString(); 
    pp::Var var_reply; 

    test_socket_support(); 

     if( message == kHelloString){
      var_reply = pp::Var("So far so good"); 
      PostMessage(var_reply); 
    }

  }

 private:

 void test_socket_support(){

  if (!pp::TCPSocket::IsAvailable()) {
      PostMessage("TCPSocket not available");
      return;
    }

  tcp_socket_ = pp::TCPSocket(this);

  if (tcp_socket_.is_null()) {
      PostMessage("Error creating TCPSocket.");
      return;
   }

  if (!pp::HostResolver::IsAvailable()) {
    PostMessage("HostResolver not available");
    return;
  }

  resolver_ = pp::HostResolver(this);
  if (resolver_.is_null()) {
    PostMessage("Error creating HostResolver.");
    return;
  }


  int port = 80;
  pp::CompletionCallback callback = \
      callback_factory_.NewCallback(&HelloTutorialInstance::OnResolveCompletion);
  PP_HostResolver_Hint hint = { PP_NETADDRESS_FAMILY_UNSPECIFIED, 0 };
  resolver_.Resolve("http://www.google.com", port, hint, callback);
  PostMessage("Resolving ...");

  }

 void OnResolveCompletion(int32_t result) {
  if (result != PP_OK) {
    char str[100] = {0}; 
    sprintf(str, "Resolved failed %d", result);
    PostMessage(str);

    if( result == PP_ERROR_NOACCESS )
        PostMessage("Access denied");
    return;
  }

  pp::NetAddress addr = resolver_.GetNetAddress(0);
  PostMessage(std::string("Resolved: ") +
              addr.DescribeAsString(true).AsString());

  }
}; 

class HelloTutorialModule : public pp::Module {
 public:
  HelloTutorialModule() : pp::Module() {}
  virtual ~HelloTutorialModule() {}

  virtual pp::Instance* CreateInstance(PP_Instance instance) {
    return new HelloTutorialInstance(instance);
  }
};

namespace pp {
  Module* CreateModule() {
  return new HelloTutorialModule();
  }
}  // namespace pp

Manifest.json:

{
  "name": "hello_tutorial",
  "version": "31.0.1650.57",
  "manifest_version": 2,
  "description": "socket Example",
  "offline_enabled": true,
  "permissions": [
    {
        "socket": [
            "tcp-listen:*:*", 
            "tcp-connect", 
            "resolve-host", 
            "udp-bind:*:*", 
            "udp-send-to:*:*"
        ]
    }
]
}

index.html的:

输出:

Resolving ... 
So far so good
Resolved failed -7 
Access denied 

srf.. 7

只有chrome商店中的打包应用才能使用套接字API.

您可以通过在启动Chrome时设置' --allow-nacl-socket-api = foo '标志来访问用于开发的套接字.将'foo'替换为您正在加载应用的主机名.如果您从本地计算机加载,则为"localhost".请注意,您应该启用"允许-NaCl的插座API"的选项,在"about:flags"中.这会覆盖命令行选项,但不包括授权主机列表,因此结果是没有主机有权使用套接字API.

1 个回答
  • 只有chrome商店中的打包应用才能使用套接字API.

    您可以通过在启动Chrome时设置' --allow-nacl-socket-api = foo '标志来访问用于开发的套接字.将'foo'替换为您正在加载应用的主机名.如果您从本地计算机加载,则为"localhost".请注意,您应该启用"允许-NaCl的插座API"的选项,在"about:flags"中.这会覆盖命令行选项,但不包括授权主机列表,因此结果是没有主机有权使用套接字API.

    2023-02-10 14:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有