有效的C代码在Swift项目中不起作用

时间:2018-02-12 22:48:23

标签: c swift macos unix-socket

我有代码:

#define SOCK_PATH "/Users/piotr/swigo.sock"

int ux_server_socket() {
    const int fd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (fd == -1) {
        printf("%s\n", strerror(errno));
        return -1;
    }
    struct sockaddr_un addr;
    bzero(&addr, sizeof(addr));
    addr.sun_len = sizeof(addr);
    addr.sun_family = AF_UNIX;
    strcpy(addr.sun_path, SOCK_PATH);

    if (unlink(addr.sun_path) == -1) {
        printf("unlink: %s\n", strerror(errno));
    }

    int retv = bind(fd, (struct sockaddr*)&addr, (socklen_t)SUN_LEN(&addr));
    if (retv == -1) {
        printf("bind: %s\n", strerror(errno));
        return -1;
    }

    printf("valid socket: %d\n", fd);
    return fd;
}

当我在Xcode中使用C语言创建项目时,此代码可以正常运行(在控制台中显示:有效套接字:3)。但是,当我在Swift(Cocoa App)中创建一个项目时,我使用此函数(以及相应的文件h和桥接头文件)向项目添加了一个C文件,但是有些东西不起作用。 我在控制台中看到了消息:

unlink: Operation not permitted
bind: Address already in use

为什么这个有效的C代码不适用于Swift项目 - 任何想法?

1 个答案:

答案 0 :(得分:0)

这是sandbox的问题,有效的解决方案是Ken Thomases在另一项任务中的想法,我需要设置两个复选框(App Sandbox,Network:Incoming Connections(Server)和Outgoing Connections(Client)):

screenshot of settings

请参阅:Creating and binding socket on Mac OS Hight Sierra