Как остановить CFSocket от отправки обратных вызовов? - PullRequest
0 голосов
/ 05 октября 2011

У меня есть серверное приложение, которое создает объект для каждого подключаемого клиента.В методе init этого объекта я использую этот код для создания CFSocket для связи с клиентом:

CFSocketContext context = {
    .info = self
};

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

Когда основная программа выполняется с клиентом, она освобождает объект ClientConnection иdealloc метод вызывается:

CFSocketDisableCallBacks( socket, kCFSocketDataCallBack );

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

CFSocketInvalidate( socket );
CFRelease( socket );

После того, как это сделано, я все еще получаю обратные вызовы данных, которые перенаправляются на теперь освобожденный объект, который вызывает сбой.

Я перепробовал все, что могвыкл, но я все еще не могу заставить эту работу.Любые идеи о том, почему CFSocket отправляет обратные вызовы после того, как он был признан недействительным?

1 Ответ

1 голос
/ 05 октября 2011

Некоторые CFSocket обратные вызовы могут автоматически включаться после того, как вы их отключили, в частности kCFSocketDataCallBack.Вполне вероятно, что обратные вызовы используются между временем, когда вы сделали вызов отключения, и когда сокет был признан недействительным.

Чтобы предотвратить такое поведение, необходимо отключить их с помощью CFSocketSetSocketFlags:

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