Связь LocalSocket с доменом Unix в Android NDK

У меня есть приложение для Android, которому необходимо установить соединение сокета домена unix с нашей библиотекой C ++ (с использованием Android NDK)

public static String SOCKET_ADDRESS = "your.local.socket.address"; // STRING

В java есть LocalSocket, который принимает «строку» (your.local.socket.address)

#define ADDRESS     "/tmp/unix.str" /* ABSOLUTE PATH */
  struct sockaddr_un saun, fsaun;
    if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("server: socket");
        exit(1);
    }
    saun.sun_family = AF_UNIX;
    strcpy(saun.sun_path, ADDRESS);

Но сокет домена unix, который находится на собственном уровне, принимает «абсолютный путь». Итак, как эти две стороны могут общаться друг с другом?

Пожалуйста, поделитесь любым примером, если возможно


person Rohit    schedule 01.02.2013    source источник
comment
обратите внимание, что на android временная общая папка находится по адресу /data/local/tmp   -  person Bernardo Ramos    schedule 02.04.2018


Ответы (2)


LocalSocket использует абстрактное пространство имен Linux вместо файловой системы. В языке C эти адреса указываются путем добавления к пути символа «\ 0».

const char name[] = "\0your.local.socket.address";
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;

// size-1 because abstract socket names are *not* null terminated
memcpy(addr.sun_path, name, sizeof(name) - 1);

Также обратите внимание, что вы не должны передавать sizeof(sockaddr_un) в bind или sendto, потому что все байты, следующие за символом '\ 0', интерпретируются как абстрактное имя сокета. Вместо этого вычислите и передайте реальный размер:

int res = sendto(sock, &data, sizeof(data), 0,
                 (struct sockaddr const *) &addr,
                 sizeof(addr.sun_family) + sizeof(name) - 1);
person John    schedule 14.10.2014
comment
Это мне очень помогло! Однако у меня проблема с получением клиентского sockaddr и длины на стороне сервера. Я хочу, чтобы клиент отправил сообщение на сервер (через UDP), а затем сервер должен ответить клиенту с информацией. Я использую recvfrom (_serverSocket, _messageBuffer, INPUT_BUFFER, 0, (struct sockaddr *) & _ clientAddress, & _clientAddressLength); на стороне сервера, однако, _clientAddressLength равен нулю, а _clientAddress пуст, и я не могу ответить клиенту, несмотря на то, что сообщение от клиента к серверу было получено правильно. - person Michael P; 01.08.2015
comment
Это мой код stackoverflow.com/questions/31755790/ - person Michael P; 01.08.2015

Pro Android C ++ с книгой NDK, глава 10 помог мне начать с того же.

person Rohit    schedule 06.02.2013