Были заданы похожие вопросы, но проблемы, похоже, очень специфичны для кода, так что, надеюсь, это нормально.
Я пытаюсь написать приложение для iOS, которое прослушивает UDP-трансляции и воздействует на данные.Более продвинутые реализации, кажется, предлагают использовать фоновые потоки и необработанные сокеты для реализации такого рода функций, но я подумал, что в качестве первой попытки я бы использовал CFSocket, чтобы упростить задачу.Я изучил пример UDPEcho от Apple, но попал в стену.
Я добавляю CFSocket в RunLoop, но мой обратный вызов никогда не вызывается.Как обычно с этим типом кода, это довольно сложно отладить.Я использовал много проверок ошибок, предложенных в UDPEcho, и все, кажется, настроено правильно.Вот код:
У меня есть объект с именем DataListener, который управляет соединениями.Это в initListener init (с удаленной проверкой ошибок:
int sock;
int err;
CFRunLoopSourceRef rls;
const CFSocketContext context = { 0, self, NULL, NULL, NULL };
sock = socket(AF_INET, SOCK_DGRAM, 0);
# Setup address struct and bind to socket for broadcast
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = 51234;
addr.sin_addr.s_addr = INADDR_ANY;
err = bind(sock, (const struct sockaddr *) &addr, sizeof(addr));
# Set flags to non-blocking
int flags;
flags = fcntl(sock,F_GETFL);
err = fcntl(sock, F_SETFL, flags | O_NONBLOCK);
# CFSocket is created, stored in the object
self->_cfSocket = CFSocketCreateWithNative(NULL,sock,kCFSocketReadCallBack,
SocketReadCallback, &context);
sock = -1;
# CFSocket is added to the Main RunLoop
rls = CFSocketCreateRunLoopSource(NULL,self->_cfSocket,0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
CFRelease(rls);
Эта функция предназначена для получения обратного вызова C (эта функция вызывается не так, как ожидалось):
static void SocketReadCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info){
DataListener* obj;
obj = (DataListener*) info;
NSLog(@"Got callback in C");
[obj readData];
}
Функция readData DataListener - это функция Obj-C, которая затем обрабатывает данные.
Что-то не так в моем коде настройки? Есть ли способ проверить, правильно ли CFSocket помещается в RunLoop?
Спасибо за любые советы или предложения по прочтению материалов. Я понимаю, что в будущем мне, вероятно, следует использовать ветку, но для этого примера я хотел бы выяснить, как это сделать с CFSocket.
Обновление: никогда не выяснял, что здесь не так. Перешел к asyncsocket: http://code.google.com/p/cocoaasyncsocket/ и жизнь хороша.