2016-09-23 72 views
0

我試圖編寫一個谷歌本地客戶端(pNacl)模塊。 客戶端應該從遠程服務器獲取一些數據。
從模塊調用該函數可以正常工作。
我剛剛起步,無法讓客戶端發送任何數據。即使是getaddrinfo的IP地址的非常基本的查找也不起作用。
當我使用wireshark轉儲網絡流量時,可以看到沒有數據包正在發送。 errno指的是getaddrinfo與「功能未實現」。即使這個簡單的代碼也行不通。它可以作爲獨立的客戶端工作,而不是作爲本地客戶端模塊。
該瀏覽器還提供了一個錯誤:
** 4的信號不可信代碼:PC = 6d98000b3360pNaCl UDP客戶端getaddrinfo函數未實現 - 不受信任的代碼

沒有任何人有什麼線索,我做錯了什麼?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <arpa/inet.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <netdb.h> 
#include <errno.h> 

void foo(){ 

    int rc; 
    struct addrinfo hints, *info; 

    memset(&hints, 0, sizeof(hints)); 

    hints.ai_socktype = SOCK_DGRAM; 
    hints.ai_family = AF_INET; 

    fprintf(stderr, "Trying: www.google.com\n"); 
    rc = getaddrinfo("www.google.com", "80", &hints, &info); 
    if(rc != 0) { 
     fprintf(stdout, "getaddrinfo: %s\n", gai_strerror(rc)); 
     fprintf(stdout, "Error: %s\n", strerror(errno)); 
    } 
    freeaddrinfo(info); 
} 

回答

0

所以我把它畢竟工作。 主要問題是,該函數在主線程上調用。 我使用了nacl_io庫,它必須在後臺線程中調用,並且需要使用nacl_io_init_ppapi(...)進行正確初始化。由於某種原因,通過nacl_io_init()進行的初始化不起作用。

因此,我將兩者都添加到pp :: Instance類的構造函數中。在函數foo()中添加線程也不起作用。看起來像在開始時必須被調用。

#include <pthread.h> 
#include <nacl_io.h> 
... 

pthread_t handle_msg_thread; 
void *handleMsgThreadFunc(void * data); // Calls function foo() 

class MyInstance : public pp::Instance { 
    public: 
    explicit MyInstance(PP_Instance instance) :pp::Instance(instance) { 
     nacl_io_init_ppapi(instance, pp::Module::Get()->get_browser_interface()); 
     pthread_create(&handle_msg_thread, NULL, &handleMsgThreadFunc, NULL); 
    } 
    ... 
}