CFN未调用网络数据包读取回调(iPhone)

CFN未调用网络数据包读取回调(iPhone),iphone,callback,udp,cfnetwork,Iphone,Callback,Udp,Cfnetwork,在iPhone模拟器上运行时,我在一个端口上监听数据包,但我的回调从未被调用(数据包确实被发送,并通过wireshark进行检查)。简化代码如下: #define IN_PORT (51112) static void ReadCallback (CFSocketRef theSocket, CFSocketCallBackType theType, CFDataRef theAddress, const void *data, void *info) { NSLog(@"Data

在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被实例化,其方法ListenPort被调用,如下所示:

myListener = [[MyListener alloc] init];
[myListener ListenOnPort:IN_PORT withCallback:&ReadCallback];
没有发生故障,但从未收到数据。数据包的来源是同一局域网上的另一台计算机,正如我提到的,它们由wireshark(具有正确ip和端口号的udp)看到

这是我第一次尝试使用这个框架。感谢您的帮助。

尝试更改:

addr.sin_port = port;
致:

(模拟器在Intel上运行,因此您需要转换为网络订单)

尝试更改:

addr.sin_port = port;
致:


(模拟器在Intel上运行,因此需要转换为网络顺序)

尝试用CFRunLoopGetMain()替换CFRunLoopGetCurrent()

尝试用CFRunLoopGetMain()替换CFRunLoopGetCurrent()