8

Mam Android aplikacji, która musi ustalić unix połączenie przez gniazdo domeny z naszej biblioteka C++ (z użyciem Android NDK)komunikacja LocalSocket z Unix domeny w Android NDK

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

Jest LocalSocket w Javie, który przyjmuje „string "(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); 

Ale gniazda UNIX, która jest w natywnej warstwy przyjmuje«absolutnej»ścieżki. Jak zatem te dwie strony mogą się ze sobą komunikować?

Proszę podzielić żadnego przykładu, jeśli to możliwe

Odpowiedz

12

LocalSocket korzysta z abstrakcyjnej przestrzeni nazw Linux zamiast z systemu plików. W C adresy te są określone przez poprzedzanie '\ 0' ścieżką.

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

Należy również pamiętać, że nie należy przechodzić sizeof(sockaddr_un) do bind lub sendto ponieważ wszystkie bajty po znaku „\ 0” są interpretowane jako abstrakcyjnej nazwy gniazda. Oblicz i podaj rzeczywisty rozmiar:

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

Bardzo mi to pomogło! Jednak mam problem z uzyskiwaniem sockaddr klienta i jego długości po stronie serwera. Chcę, aby klient wysłał wiadomość do serwera (przez UDP), a następnie serwer powinien odpowiedzieć klientowi informacjami. Używam recvfrom (_serverSocket, _messageBuffer, INPUT_BUFFER, 0, (struct sockaddr *) & _ clientAddress, & _clientAddressLength); po stronie serwera, _clientAddressLength ma wartość zero, a parametr _clientAddress jest pusty i nie mogę odpowiedzieć na klienta, mimo że wiadomość od klienta do serwera została odebrana poprawnie. –

+0

To jest mój kod http://stackoverflow.com/questions/31755790/sockets-unix-domain-udp-c-recvfrom-fail-to-populate-the-source-address?noredirect=1#comment51445587_31755790 –