iOS - CFSocket не получает обратный вызов - PullRequest
0 голосов
/ 03 июля 2011

Были заданы похожие вопросы, но проблемы, похоже, очень специфичны для кода, так что, надеюсь, это нормально.

Я пытаюсь написать приложение для 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/ и жизнь хороша.

Ответы [ 2 ]

1 голос
/ 04 ноября 2013

Попробуйте заменить CFRunLoopGetCurrent () на CFRunLoopGetMain ()

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

kCFSocketReadCallBack изменить на kCFSocketDataCallBack

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