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];
障害は発生しませんが、データが受信されることはありません。パケットの送信元は同じLAN上の別のコンピューターであり、前述したように、wireshark(正しいIPとポート番号を持つUDP)によって認識されます。
このフレームワークを使おうとするのはこれが初めてです。どんな助けでも大歓迎です。