iphone - iOS - CFSocket 没有得到回调

标签 iphone objective-c ios callback udp

类似的问题已经被问到,但问题似乎是非常特定于代码的,所以希望这没问题。

我正在尝试编写一个 iOS 应用程序来监听 UDP 广播并对数据进行操作。更高级的实现似乎建议使用后台线程和原始套接字来实现这种功能,但我认为作为第一次尝试我会使用 CFSocket 来保持简单。我研究了 Apple 的 UDPEcho 示例,但遇到了瓶颈。

我将 CFSocket 添加到 RunLoop,但我的回调从未被调用。与这种类型的代码一样,这很难调试。我已经使用了 UDPEcho 中建议的大量错误检查,并且一切似乎都已正确设置。这是代码:

我有一个名为 DataListener 的对象来管理连接。这是在 DataListener init 中(删除了错误检查:

int sock;
int err;
CFRunLoopSourceRef rls;
const CFSocketContext   context = { 0, self, NULL, NULL, NULL };

sock = socket(AF_INET, SOCK_DGRAM, 0);

# Setup address struct and bind to socket for broadcast
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = 51234;
addr.sin_addr.s_addr = INADDR_ANY;
err = bind(sock, (const struct sockaddr *) &addr, sizeof(addr));

# Set flags to non-blocking
int flags;
flags = fcntl(sock,F_GETFL);
err = fcntl(sock, F_SETFL, flags | O_NONBLOCK);

# CFSocket is created, stored in the object
self->_cfSocket = CFSocketCreateWithNative(NULL,sock,kCFSocketReadCallBack,   
                                           SocketReadCallback, &context);
sock = -1;
# CFSocket is added to the Main RunLoop
rls = CFSocketCreateRunLoopSource(NULL,self->_cfSocket,0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);
CFRelease(rls);

此函数旨在获取 C 回调(此函数未按预期调用):

static void SocketReadCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info){
    DataListener* obj;
    obj = (DataListener*) info;
    NSLog(@"Got callback in C");
    [obj readData];
}

DataListener readData 函数是一个处理数据的 Obj-C 函数。

我的设置代码有问题吗?有没有办法验证 CFSocket 是否正确放置在 RunLoop 上?

感谢您对阅读 Material 的任何提示或建议。我意识到将来我可能应该使用线程,但对于这个示例,我想弄清楚如何使用 CFSocket 执行此操作。

更新:从来没有弄清楚这里出了什么问题。转到异步套接字:http://code.google.com/p/cocoaasyncsocket/生活是美好的。

最佳答案

kCFSocketReadCallBack 更改为 kCFSocketDataCallBack

关于iphone - iOS - CFSocket 没有得到回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6564974/

相关文章:

ios - Swift:正确处理登录错误状态?

ios - 将目标添加到所有 UIButtons 的 touchUpInside 事件

android - 为同一应用程序、多个平台设置 Google Analytics 的最佳方式

ios - 如何创建自定义选项卡式 View ,如 Peach 应用程序中的 View

iphone - 如何从 iPhone 通过 WiFi 向 Mac 发送命令?

ios - NSMutableString 的内存问题

iphone - 使用 SBJSON 解析 JSON 字符串时出现内存泄漏

iOS App更新新版本从Documents文件夹中删除文件

ios - subview 变为 nil - UIStoryboard

iphone - 在cocos2d中仅加载大图像的可见区域