2011-10-05 5 views
0

나는 연결된 모든 클라이언트에 대해 객체를 만드는 서버 응용 프로그램을 가지고 있습니다. 이 객체의 init 방법 나는 클라이언트와 통신 할 CFSocket을 만들려면이 코드를 사용하여 메인 프로그램이 클라이언트와 완료되면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이 무효화 된 후 콜백을 보내는 이유에 대한 아이디어가 있습니까?

+0

이 문제를 해결했다. 실현하지 않고 콜백 핸들러 내부에서 릴리스 (및 따라서 dealloc)를 호출했습니다. CFSocket이 그런 것을 좋아하지 않는다는 것을 알았습니다. – Sven

답변

1

일부 CFSocket 콜백은 비활성화 한 후에 특히 kCFSocketDataCallBack과 같이 자동으로 다시 사용하도록 설정 될 수 있습니다. 비활성화 된 호출을 만든 시간과 소켓이 무효화 된 시간 사이에 콜백이 사용 된 것 같습니다.

가이 문제를 방지하려면 CFSocketSetSocketFlags로 해제해야합니다

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

좋은 정보, 그러나 이것은 문제가 아니 었습니다. CFSocket은 콜백 처리기 내부에서 무효화되는 것을 좋아하지 않습니다. – Sven

관련 문제