开发者

How to stop CFSocket from sending callbacks?

开发者 https://www.devze.com 2023-04-11 03:23 出处:网络
I have a server app which creates an object for every client that connects. In this object\'s init method I use this code to create a CFSocket to communicate with the client:

I have a server app which creates an object for every client that connects. In this object's init method I use this code to create a CFSocket to communicate with the client:

CFSocketContext context = {
    .info = self
};

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

When the main program is done with the client it releases the ClientConnection object and it's dealloc method gets called:

CFSocketDisableCallBacks( socket, kCFSocketDataCallBack );

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

CFSocketInvalidate( socket );
CFRelease( socket );

After that is done I still receive data callbacks which get routed to the now deallocated object which causes a crash.

I tried everything I can think off, but I still can't make this work. Any ideas about why the CFSocket is sending callback开发者_Python百科s after it has been invalidated?


Some CFSocket callbacks may be automatically reenabled after you have disabled them, notably kCFSocketDataCallBack. It seems likely that the callbacks are being used between the time you made the disable call, and when the socket was invalidated.

To prevent this behaviour, you need to disable them with CFSocketSetSocketFlags:

CFOptionFlags sockopt = CFSocketGetSocketFlags (mysock);
sockopt &= kCFSocketDataCallBack;
CFSocketSetSocketFlags(s, sockopt);
0

精彩评论

暂无评论...
验证码 换一张
取 消