8

ho applicazione Android, che ha bisogno di stabilire unix connessione socket di dominio con nostra libreria C++ (usando Android NDK)comunicazione LocalSocket con Dominio Unix in Android NDK

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

C'è LocalSocket in Java che accetta "stringa "(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); 

Ma il socket di dominio unix che è al livello nativo accetta "percorso assoluto". Quindi, come possono queste due parti comunicare tra loro?

prega di condividere qualche esempio, se possibile

risposta

12

LocalSocket utilizza lo spazio dei nomi astratto Linux anziché il file system. In C questi indirizzi sono specificati anteponendo '\ 0' al percorso.

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); 

Si noti inoltre che non si deve passare sizeof(sockaddr_un)-bind o sendto perché tutti i byte dopo il carattere '\ 0' sono interpretati come il nome astratto presa. Calcola e passa invece la dimensione reale:

int res = sendto(sock, &data, sizeof(data), 0, 
       (struct sockaddr const *) &addr, 
       sizeof(addr.sun_family) + sizeof(name) - 1); 
+0

Questo mi ha aiutato molto! Tuttavia ho un problema con ottenere sockaddr del client e la lunghezza sul lato server. Voglio che il client invii un messaggio al server (tramite UDP) e quindi il server dovrebbe rispondere al cliente con le informazioni. Io uso recvfrom (_serverSocket, _messageBuffer, INPUT_BUFFER, 0, (struct sockaddr *) e _ clientAddress, & _clientAddressLength); sul lato server, tuttavia _clientAddressLength è zero e _clientAddress è vuoto e non riesco a rispondere al client, nonostante il fatto che il messaggio da client a server sia stato ricevuto correttamente. –

+0

Questo è il mio codice http://stackoverflow.com/questions/31755790/sockets-unix-domain-udp-c-recvfrom-fail-to-populate-the-source-address?noredirect=1#comment51445587_31755790 –