Обратный вызов чтения пакета CFNetwork не вызывается (iPhone) - PullRequest
0 голосов
/ 27 августа 2010

Работая на симуляторе iPhone, я слушаю порт на пакеты, но мой обратный вызов никогда не вызывается (и пакеты отправляются точно, проверено с помощью wireshark) Ниже приведен упрощенный код:

#define IN_PORT  (51112)

static void ReadCallback (CFSocketRef theSocket, CFSocketCallBackType theType, CFDataRef theAddress, const void *data, void *info) 
{
    NSLog(@"Data received");
}

@implementation MyListener
- (void) ListenOnPort:(uint16_t)port withCallback:(CFSocketCallBack)callback 
{
    CFSocketContext context = {0,self,NULL,NULL,NULL};
    CFSocketRef cfSocket = CFSocketCreate(NULL, PF_INET, SOCK_DGRAM, PPROTO_UDP, kCFSocketReadCallBack, callback, &context);
    if (cfSocket==NULL)
        NSLog(@"CFSocketCreate failed");

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

    NSData *address = [NSData dataWithBytes:&addr length:sizeof(addr)];
    if(kCFSocketSuccess != CFSocketSetAddress(cfSocket, (CFDataRef)address))
        NSLog(@"CFSocketSetAddress failed");

    CFRunLoopSourceRef rls = CFSocketCreateRunLoopSource(kCFAllocatorDefault, cfSocket, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopCommonModes);
    CFRelease(rls);
}
@end

Где-то еще в коде создается экземпляр MyListener и вызывается его метод ListenOnPort, например:

myListener = [[MyListener alloc] init];
[myListener ListenOnPort:IN_PORT withCallback:&ReadCallback];

Не происходит сбоев, но данные никогда не принимаются. Источником пакетов является другой компьютер с той же локальной сетью, и, как я уже говорил, они видятся с помощью wireshark (udp с правильным ip и номером порта).

Это первый раз, когда я пытаюсь использовать этот фреймворк. Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2013

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

2 голосов
/ 27 августа 2010

Попробуйте изменить:

addr.sin_port = port;

Кому:

addr.sin_port = htons(port);

(Симулятор работает на Intel, поэтому вам нужно преобразовать его в сетевой порядок)

...