使用EPERM,nacl_io绑定失败

时间:2014-12-14 15:34:47

标签: google-nativeclient

我写了一些使用nacl_io套接字的演示应用, 但是使用errno == EPERM

绑定失败

用pepper_37建造, 谷歌浏览器39.0.2171.95(m) OS Windows 7或Server 2008 R2 SP1 64位 PNaCl翻译版本0.1.0.13769

镀铬标志: --allow-nacl-socket-api = localhost --no-sandbox --enable-nacl

class ProxyTesterInstance : public pp::Instance 
   {
     public:

  explicit ProxyTesterInstance(PP_Instance instance, PPB_GetInterface get_interface) : pp::Instance(instance)
  {
    nacl_io_init_ppapi(instance, get_interface);
  }
  virtual ~ProxyTesterInstance() {}

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

    std::string message = var_message.AsString();

    if (message == kStartString) 
    {
        reply(kReplyStartString);

        int fd = socket( PF_INET, SOCK_STREAM, 0);

        struct sockaddr_in myaddr;
        myaddr.sin_family = PF_INET;
        myaddr.sin_port = htons(50000);
        inet_aton("0.0.0.0", &myaddr.sin_addr );
        int res = bind(fd, (struct sockaddr*)&myaddr, sizeof(myaddr)); //returns -1

        myaddr.sin_port = htons(80);
        inet_aton("173.194.113.2", &myaddr.sin_addr );

        res = connect(fd, (struct sockaddr*)&myaddr, sizeof(myaddr)); //returns 0

    }

1 个答案:

答案 0 :(得分:2)

nacl_io假设它正在工作线程上运行,而不是主线程。这是因为许多套接字函数都是阻塞的,但阻止NaCl应用程序中的主线程是违法的。不幸的是,错误消息并不十分清楚地解释了这个约束。

使此代码工作的最简单方法是使用ppapi_simple库。它将为您初始化nacl_io并开始在工作线程上运行您的代码。此时,您将能够进行阻塞调用(例如绑定)。它还为您提供了一个类似主要的入口点,而不必创建pp::Instance

看一下NaCl SDK中的一些演示(例如examples/demo/earthexamples/demo/pi_generator),了解如何使用ppapi_simple。