простой асинхронный клиент с использованием CFSocket - PullRequest
0 голосов
/ 11 октября 2011

Также я знаком с BSD-сокетами, я новичок в Obj-C и Cocoa, так что терпите меня:)

Я пытаюсь найти простой TCP-клиент в консольном приложении, который простополучает данные в фоновом режиме.Я хотел бы использовать CFSockets для этого из-за удобных функций обратного вызова (реализация его с простыми сокетами в автономном потоке не будет проблемой, но я хочу сделать это способом Mac).

Где яЯ застрял в том, как использовать функции обратного вызова без RunLoop или как заставить RunLoop работать без блокировки.Насколько я понимаю, невозможно поместить RunLoop в GCD (по крайней мере, я пробовал, и цикл никогда не запускался).Так каковы альтернативы?Можно ли запустить RunLoop в NSThread?более простой способ?

Вот фрагмент кода, который я использую.Он отлично работает как одно задание.

CFSocketRef TCPClient;
CFSocketContext CTX = { 0, "MYCLIENT", NULL, NULL, NULL };
TCPClient = CFSocketCreate(NULL, PF_INET, SOCK_STREAM, IPPROTO_TCP,
    kCFSocketReadCallBack, (CFSocketCallBack)ConnectCallBack, &CTX);
[...]
CFDataRef connectAddr = CFDataCreate(NULL, (unsigned char *)&addr, sizeof(addr));
CFSocketConnectToAddress(TCPClient, connectAddr, −1);
CFRunLoopSourceRef sourceRef = CFSocketCreateRunLoopSource(kCFAllocatorDefault, TCPClient, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes);
CFRelease(sourceRef);
CFRunLoopRun();

Заранее спасибо!Thomas

1 Ответ

0 голосов
/ 11 октября 2011

Я рекомендую AsyncSocket , объективный облегченный фреймворк (всего несколько файлов), с опциональным GDC, очень хорошо закодированный во многом в стиле Mac.

AsyncSocketсетевая библиотека сокетов TCP / IP, которая связывает CFSocket и CFStreamОн предлагает асинхронную операцию и собственный класс какао с поддержкой делегатов.

Вы можете настроить его (с помощью методов делегата) для использования текущего цикла выполнения или любого другого цикла выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...