Сбой привязки nacl_io с EPERM

Я написал демонстрационное приложение, которое использует сокеты nacl_io, но связывание завершается с ошибкой errno == EPERM.

сборка с помощью перец_37, Google Chrome 39.0.2171.95 (m) ОС 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

    }

person Igor Barbarian    schedule 14.12.2014    source источник


Ответы (1)


nacl_io предполагает, что он запускается в рабочем потоке, а не в основном потоке. Это связано с тем, что многие функции сокетов блокируются, но блокировать основной поток в приложении NaCl незаконно. К сожалению, сообщения об ошибках не очень ясно объясняют это ограничение.

Самый простой способ заставить этот код работать — использовать библиотеку ppapi_simple. Он инициализирует nacl_io и запустит ваш код в рабочем потоке. На этом этапе вы сможете выполнять блокирующие вызовы (например, привязку). Это также дает вам точку входа, подобную основной, вместо того, чтобы создавать файл pp::Instance.

Взгляните на некоторые демонстрации в NaCl SDK (например, examples/demo/earth, examples/demo/pi_generator), чтобы узнать, как использовать ppapi_simple.

person binji    schedule 15.12.2014
comment
Изменено, чтобы использовать ppapi_simple, предыдущий код (материал сокета) - это первое, что я делаю в main. Сокет создан, но привязка завершается с ошибкой EACCES. Я запускаю хром с --allow-nacl-socket-api=localhost, также пытался добавить флаги --no-sandbox, но это не помогло. (Накл сокет апи в настройках отключен). - person Igor Barbarian; 16.12.2014
comment
Это ошибка, возникающая, когда страница, обращающаяся к сокетам, не имеет разрешения. Убедитесь, что ваше приложение обслуживается с localhost... в противном случае вам нужно изменить строку на --allow-nacl- socket-api=‹мое происхождение› - person binji; 18.12.2014