2013-12-16 35 views
0

所以我通過init.rc啓動了一個自定義的本地守護進程。 它試圖這樣做無論是這樣的:Android(native):爲什麼我的套接字不可用於其他進程?

x_con = android_get_control_socket("test"); 
int ret = listen(x_con, 1); 
int new_s = accept(x_con, (struct sockaddr*)&peeraddr, &socklen); 

或者這樣:

x_con = socket_local_server("test:, ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM); 
int new_s = accept(x_con, (struct sockaddr*)&peeraddr, &socklen); 

在任意一個時刻,我可以看到插座/dev/socket下,它有0666訪問掩碼(由於init.rc設置PARAMS)但仍然不能接受任何連接(似乎對其他進程不可用)。

這是由於'偏執狂網絡'Android的功能?

回答

0

與「普通」套接字相比,Android套接字模型似乎很奇怪。

首先,套接字必須通過init.rc初始化,並給予一定的權限。

接下來,服務器應用程序打開它:

x_con = android_get_control_socket("test"); 

接下來,聽()和fnctl()的調用是必需的:

listen(x_con, 1); 
fcntl(x_con, F_SETFD, FD_CLOEXEC); 

之後,從Java LocalSocket連接可訪問插座,並且套接字可以接受客戶端。

設置已非阻塞模式後來被允許過:

fnctl(x_con, F_SETFL, O_NONBLOCK); 

其他組合是不必要的(也有一些喜歡導遊與Android的無線層接口(RIL)工作 - 不會鏈接到那個低等級的手冊 - 說明了socket_local_server和android_get_control_socket都是必需的,這顯然是不真實的)。

+0

我的一些實驗仍然不清楚訪問權限 - 套接字有時會被創建錯誤的權限。 –

相關問題