首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止CFSocket发送回调?

如何阻止CFSocket发送回调?
EN

Stack Overflow用户
提问于 2011-10-05 22:49:28
回答 1查看 1.4K关注 0票数 0

我有一个服务器应用程序,为每个连接的客户端创建一个对象。在这个对象的init方法中,我使用下面的代码来创建一个与客户端通信的CFSocket

代码语言:javascript
复制
CFSocketContext context = {
    .info = self
};

socket = CFSocketCreateWithNative( kCFAllocatorDefault, nativeSocket, kCFSocketDataCallBack, SocketCallback, &context );
source = CFSocketCreateRunLoopSource( kCFAllocatorDefault, socket, 0 );
CFRunLoopAddSource( CFRunLoopGetMain(), source, kCFRunLoopCommonModes );

当主程序处理完客户端时,它会释放ClientConnection对象并调用它的dealloc方法:

代码语言:javascript
复制
CFSocketDisableCallBacks( socket, kCFSocketDataCallBack );

CFRunLoopRemoveSource( CFRunLoopGetMain(), source, kCFRunLoopCommonModes );
CFRelease( source );

CFSocketInvalidate( socket );
CFRelease( socket );

在此之后,我仍然收到数据回调,这些回调被路由到现在已释放的对象,这会导致崩溃。

我试了我能想到的所有方法,但我还是做不到。关于CFSocket为什么在失效后发送回调,有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2011-10-05 23:22:19

某些CFSocket回调可能会在您禁用它们后自动重新启用,特别是kCFSocketDataCallBack。似乎在您发出禁用调用的时间和套接字失效的时间之间正在使用回调。

要防止此行为,您需要使用CFSocketSetSocketFlags禁用它们

代码语言:javascript
复制
CFOptionFlags sockopt = CFSocketGetSocketFlags (mysock);
sockopt &= kCFSocketDataCallBack;
CFSocketSetSocketFlags(s, sockopt);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7663227

复制
相关文章

相似问题

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