我写了一些使用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
}
答案 0 :(得分:2)
nacl_io
假设它正在工作线程上运行,而不是主线程。这是因为许多套接字函数都是阻塞的,但阻止NaCl应用程序中的主线程是违法的。不幸的是,错误消息并不十分清楚地解释了这个约束。
使此代码工作的最简单方法是使用ppapi_simple库。它将为您初始化nacl_io并开始在工作线程上运行您的代码。此时,您将能够进行阻塞调用(例如绑定)。它还为您提供了一个类似主要的入口点,而不必创建pp::Instance
。
看一下NaCl SDK中的一些演示(例如examples/demo/earth
,examples/demo/pi_generator
),了解如何使用ppapi_simple。