接收UDP广播数据
Receiving UDP broadcast data
我正在尝试在 iOS 上接收广播 UDP 数据报。我开始使用看起来不错的 CocoaAsyncSocket 库。我是这样使用它的:
m_socket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
[m_socket setIPv6Enabled:NO];
NSError* error = nil;
if (![m_socket enableBroadcast:YES error:&error])
return log_warn(@"Failed to enable broadcast: %@.", error.description);
if (![m_socket bindToPort:43211 error:&error])
return log_warn(@"Failed to bind to port: %@.", error.description);
if (![m_socket beginReceiving:&error])
return log_warn(@"Failed to begin receiving.");
结果didReceiveData回调好像没有被调用。
因此,我尝试使用常规套接字 API,似乎我可以获得一些字节:我只是使用 this code.
我很好奇为什么上面的 CocoaAsyncSocket 代码不起作用。我试图通过阅读 CocoaAsyncSocket 的内部结构来比较这两种方法,但我仍然无法找到导致没有字节到达的差异。我是否在使用 CocoaAsyncSocket 的上述代码中遗漏了什么?
通过阅读 CocoaAsyncSocket 中的代码,我发现持有委托引用的成员很弱。因此,没有收到回调和错误的原因是委托被释放了。存储对对象的强引用足以获取数据。
我正在尝试在 iOS 上接收广播 UDP 数据报。我开始使用看起来不错的 CocoaAsyncSocket 库。我是这样使用它的:
m_socket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
[m_socket setIPv6Enabled:NO];
NSError* error = nil;
if (![m_socket enableBroadcast:YES error:&error])
return log_warn(@"Failed to enable broadcast: %@.", error.description);
if (![m_socket bindToPort:43211 error:&error])
return log_warn(@"Failed to bind to port: %@.", error.description);
if (![m_socket beginReceiving:&error])
return log_warn(@"Failed to begin receiving.");
结果didReceiveData回调好像没有被调用。 因此,我尝试使用常规套接字 API,似乎我可以获得一些字节:我只是使用 this code.
我很好奇为什么上面的 CocoaAsyncSocket 代码不起作用。我试图通过阅读 CocoaAsyncSocket 的内部结构来比较这两种方法,但我仍然无法找到导致没有字节到达的差异。我是否在使用 CocoaAsyncSocket 的上述代码中遗漏了什么?
通过阅读 CocoaAsyncSocket 中的代码,我发现持有委托引用的成员很弱。因此,没有收到回调和错误的原因是委托被释放了。存储对对象的强引用足以获取数据。