2013-12-16 1 views
0

Итак, я запускаю собственный собственный демон через init.rc. Он пытается сделать что-либо в этом:Android (родной): почему мой сокет недоступен для других процессов?

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 (из-за Params, установленных в init.rc) но все равно не может принять какое-либо соединение (казалось бы, недоступное для других процессов).

Это связано с особенностью Android от Paranoid Network?

ответ

0

Модель сокета для Android, по-видимому, очень странная по сравнению с обычными сокетами.

Во-первых, сокет должен быть инициализирован через init.rc, учитывая определенные разрешения.

Далее серверное приложение открывает его:

x_con = android_get_control_socket("test"); 

Далее слушать() и fnctl() вызовы необходимы:

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

После этого соединение LocalSocket от Java может получить доступ гнездо , и сокет может принимать клиентов.

Настройка неблокируемому режим позже допускается также:

fnctl(x_con, F_SETFL, O_NONBLOCK); 

Другие комбинации не нужны (и есть некоторые гиды, как Работа с радио Layer Interface (RIL) в Android - не будет ссылаться на это низкосортное руководство - заявляют, что требуются как socket_local_server, так и android_get_control_socket, что явно неверно).

+0

Некоторые из моих экспериментов по-прежнему неясны с правами доступа - сокеты создаются с неправильными разрешениями иногда. –

Смежные вопросы