2010-08-27 19 views
0

En cours d'exécution sur le simulateur iPhone, j'écoute sur un port pour les paquets, mais mon callback n'est jamais appelé (et les paquets sont envoyés, vérifiés avec wireshark). Code simplifié suit:Rappel de lecture de paquets CFNetwork non appelé (iPhone)

#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 

Ailleurs dans le code, MyListener est instancié et sa méthode ListenOnPort est appelée, comme ceci:

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

Aucune défaillance se produit, mais les données ne sont jamais reçu. Source de paquets est un autre ordinateur sur le même LAN, et comme je l'ai mentionné, ils sont vus par wireshark (UDP avec IP correct et numéro de port).

C'est la première fois que j'essaie d'utiliser ce framework. Toute aide est appréciée.

Répondre

2

Essayez de changer:

addr.sin_port = port; 

Pour:

addr.sin_port = htons(port); 

(Le simulateur fonctionne sur Intel afin que vous devez convertir en ordre du réseau)

+0

C'était tout. Merci! – apalopohapa

0

Essayez de remplacer CFRunLoopGetCurrent() avec CFRunLoopGetMain()