Comunicación de LocalSocket con el dominio de Unix en Android NDK
Tengo la aplicación de Android, que necesita establecer conexión de socket de dominio unix con nuestra biblioteca de C ++ (utilizando Android NDK)
public static String SOCKET_ADDRESS = "your.local.socket.address"; // STRING
Hay LocalSocket en java que acepta "cadena" (your.local.socket.address)
- Acceda a la impresora a través de Wifi desde el dispositivo Android
- ¿Cómo asociar la intención de conectividad a socket?
- Android M doze modo y socket "nativo" posix congelado
- Android VpnService proteger socket que se almacena en código nativo?
- Android - Socket del servidor
#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);
Pero el socket de dominio unix que está en capa nativa acepta "ruta absoluta". Entonces, ¿cómo pueden estas dos partes comunicarse entre sí?
Por favor comparta cualquier ejemplo si es posible
- Socket para servidor Android
- Comunicación con Java socket de Android con Socket.IO
- Socket Android excepción "socket está cerrado"
- Pérdida severa de paquetes UDP en algunos dispositivos Android
- Audio de la corriente del androide al servidor
- Socket - Cliente Java, Servidor C #
- Socket Android: java.net.SocketException: No hay ruta para alojar
- Enviar datos a través de wifi (no internet) cuando los datos móviles
LocalSocket utiliza el espacio de nombres abstracto de Linux en lugar del sistema de archivos. En C estas direcciones se especifican añadiendo '\ 0' a la ruta.
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);
Observe también que no debe pasar sizeof(sockaddr_un)
para bind
o sendto
porque todos los bytes que siguen al carácter '\ 0' se interpretan como el nombre abstracto del socket. Calcule y pase el tamaño real en su lugar:
int res = sendto(sock, &data, sizeof(data), 0, (struct sockaddr const *) &addr, sizeof(addr.sun_family) + sizeof(name) - 1);
Pro Android C ++ con el libro NDK, capítulo 10 me ayudó a empezar con lo mismo.
- La base de datos de Android recrea cada vez que se inicia la aplicación
- Dagger 2: Proporcionar la misma instancia entre múltiples componentes con el mismo alcance en diferentes módulos de biblioteca