【问题标题】:LocalSocket communication with Unix Domain in Android NDKAndroid NDK 中与 Unix 域的 LocalSocket 通信
【发布时间】:2013-01-16 14:30:20
【问题描述】:

我有 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 域套接字接受“绝对路径”。那么这两方如何相互沟通呢?

如果可能,请分享任何示例

【问题讨论】:

  • 请注意,在 android 上,临时共享文件夹位于 /data/local/tmp

标签: android sockets network-programming android-ndk unix-socket


【解决方案1】:

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) 传递给bindsendto,因为'\0' 字符后面的所有字节都被解释为抽象套接字名称。计算并传递实际尺寸:

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

【讨论】:

  • 这对我帮助很大!但是,我在服务器端获取客户端的 sockaddr 和长度时遇到问题。我希望客户端向服务器发送一条消息(通过 UDP),然后服务器应该向客户端响应信息。我使用 recvfrom(_serverSocket, _messageBuffer, INPUT_BUFFER, 0, (struct sockaddr *)&_clientAddress, &_clientAddressLength);在服务器端,但是 _clientAddressLength 为零,_clientAddress 为空,我无法响应客户端,尽管从客户端到服务器的消息已正确接收。
【解决方案2】:

Pro Android C++ with the NDK book, chapter 10 帮助我开始使用它。

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多