Создание и привязка сокета в 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 целевых настроек.