Создание и привязка сокета в Mac OS Hight Sierra

У меня серьезная и странная проблема с созданием сокета в моем приложении для Hight Sierra. Если я создаю инструмент командной строки, все в порядке! Я создаю сокет, связываю сокет. Но если я пытаюсь создать приложение Cocoa, я не могу привязать свой сокет!:(

Если я использую CFSockets в приложении Какао,

    char punchline[] = "MESSAGE from Server!";
    int yes = 1;

    CFSocketContext CTX = {0, punchline, NULL, NULL, NULL};

    CFSocketRef TCPServer = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketAcceptCallBack, (CFSocketCallBack) &AcceptCallBack, &CTX);


    if (TCPServer == NULL) return;

    setsockopt(CFSocketGetNative(TCPServer), SOL_SOCKET, SO_REUSEADDR, (void *) &yes, sizeof(yes));

    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_len = sizeof(addr);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(33000);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);

    NSData *address = [NSData dataWithBytes:&addr length:sizeof(addr)];

    if (CFSocketSetAddress(TCPServer, (CFDataRef) address) != kCFSocketSuccess) {
        CFRelease(TCPServer);
        return;
    }

Я получаю это сообщение:

Ошибка привязки CFSocketSetAddress: 1

Если я использую функцию низкого уровня C в приложении Какао, вот так:

  sockfd = socket(AF_INET, SOCK_STREAM, 0);

  bzero((char *) &serv_addr, sizeof(serv_addr));
  portno = atoi(argv[1]);

  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = htons(portno);

  if (bind(sockfd, (struct sockaddr *) &serv_addr,
             sizeof(serv_addr)) < 0) error("ERROR on binding");

    listen(sockfd,5);
    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

... это тоже не работает, и я получаю сообщение об ошибке привязки, а также это сообщение в консоли:

ОШИБКА: операция не разрешена

Но в инструменте командной строки все работает хорошо!

Какие настройки проекта (могут быть в info.plist) мне нужно исправить? Где проблема?:(

Помоги мне!:(((

1 ответ

Решение

Проблема заключалась в том, что приложение было помещено в "песочницу" и не имело права "Сеть: входящие подключения". Это право может быть добавлено в XCode в деталях песочницы приложения на вкладке Capabilities целевых настроек.

Чтобы исправить это в macOS Catalina версии 10.15.3:

Другие вопросы по тегам