Как настроить сокет домена UNIX в iOS? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь настроить сокет домена UNIX в iOS.Согласно https://iphonedevwiki.net/index.php/Unix_sockets, это код, который я использовал для установки сокета на стороне сервера:

    const char *socket_path = "/var/run/myserver.socket";
    // setup socket
    struct sockaddr_un local;
    strcpy(local.sun_path, socket_path);
    unlink(local.sun_path);
    local.sun_family = AF_UNIX;
    int listenfd = socket(AF_UNIX, SOCK_STREAM, 0);
    printf("listenfd: %d\n", listenfd);
    // start the server
    int r = -1;
    while(r != 0) {
        r = bind(listenfd, (struct sockaddr*)&local, sizeof(local));
        printf("bind: %d\n", r);
        usleep(200 * 1000);
    }
    int one = 1;
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
    // start listening for new connections
    r = -1;
    while(r != 0) {
        r = listen(listenfd, 20);
        printf("listen: %d\n", r);
        usleep(200 * 1000);
    }
    // wait for new connection, and then process it
    int connfd = -1;
    while(true) {
        if(connfd == -1) {
            // wait for new connection
            connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
            printf("new connfd: %d\n", connfd);
        }
        // process incoming data
        char buffer[4096];
        int len = recv(connfd, buffer, sizeof(buffer), 0);
        if(len == 0) {
            printf("connfd %d disconnected!\n", connfd);
            connfd = -1;
            continue;
        } else {
            printf("connfd %d recieved data: %s", connfd, buffer);
            // send some data back (optional)
            const char *response = "got it!\n";
            send(connfd, response, strlen(response) + 1, 0);
        }
    }

Однако, когда я запускаю этот код на своем iPhone, я получаю его вconsole:

listenfd: 3
bind: -1
bind: -1
bind: -1
bind: -1
bind: -1
...

Похоже, есть проблема, когда мы выполняем bind (), когда он возвращает -1, я хочу знать, что я делаю неправильно в коде?Значение errno равно 1, что равно OPERATION_NOT_PERMITTED

1 Ответ

0 голосов
/ 14 мая 2019

Вам не разрешено создавать объекты в / var / run на iOS.Вам необходимо поместить сокет в каталог, где вам разрешено создавать объекты, например FileManager.shared.temporaryDirectory.

...