首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS - CFSocket未收到回调

iOS - CFSocket未收到回调
EN

Stack Overflow用户
提问于 2011-07-04 03:11:18
回答 2查看 5.4K关注 0票数 0

类似的问题已经被问过了,但是问题似乎是代码特定的,所以希望这是可以的。

我正在尝试编写一个iOS应用程序,它可以侦听UDP广播并对数据执行操作。更高级的实现似乎建议使用后台线程和原始套接字来实现这种功能,但我认为作为第一次尝试,我会使用CFSocket来使事情变得简单。我研究过苹果公司的UDPEcho示例,但遇到了困难。

我将CFSocket添加到RunLoop中,但从未调用过我的回调。与通常的这类代码一样,这很难调试。我使用了很多在UDPEcho中建议的错误检查,似乎所有的设置都是正确的。代码如下:

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

代码语言:javascript
复制
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回调(此函数未按预期调用):

代码语言:javascript
复制
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上?

感谢您对阅读材料的任何提示或建议。我意识到将来我可能会使用线程,但对于这个例子,我想知道如何使用CFSocket来做到这一点。

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

EN

回答 2

Stack Overflow用户

发布于 2011-10-11 13:01:03

kCFSocketReadCallBack更改为kCFSocketDataCallBack

票数 1
EN

Stack Overflow用户

发布于 2013-11-04 14:51:17

尝试将CFRunLoopGetCurrent()替换为CFRunLoopGetMain()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6564974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档