10

私はAndroidアプリケーションを持っています。これはC++ライブラリとのUNIXドメインソケット接続を確立する必要があります(Android NDKを使用)

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

「文字列」(your.local.socket.address)を受け入れるJavaのLocalSocketがあります

#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ドメインソケットは「絶対パス」を受け入れます。では、これら2つの当事者はどのように相互に通信できるのでしょうか。

可能であれば例を共有してください

4

2 に答える 2

15

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

また、「\ 0」文字に続くすべてのバイトが抽象ソケット名として解釈されるため、sizeof(sockaddr_un)または bindに渡さないように注意してください。sendto代わりに実際のサイズを計算して渡します。

int res = sendto(sock, &data, sizeof(data), 0,
                 (struct sockaddr const *) &addr,
                 sizeof(addr.sun_family) + sizeof(name) - 1);
于 2014-10-14T12:58:19.170 に答える
0

NDKブックを備えたProAndroidC ++、第10章は、同じことを始めるのに役立ちました。

于 2013-02-06T07:09:57.967 に答える