7

을 연 후 오래 걸립니다 내가 가지고있는 네트워크 서비스를 발견하기위한 다음 코드를NSNetServiceBrowser didRemoveService 스트림

이러한 두 가지 방법으로 호출 결과
[netServiceBrowser setDelegate: self]; 
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain]; 

(서비스를 서비스를 찾아 제거) :

- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser 
     didFindService:(NSNetService*) netService ... {} 

- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser 
     didRemoveService:(NSNetService*) netService ... {} 

잘 작동합니다. 장치를 끄면 즉시이 수신 되 고 didRemoveService 호가 수신됩니다. I는 장치 (입력, 출력 또는 둘 다) 스트림을 열면

그러나 :

[netService getInputStream: &inputStream outputStream: &outputStream]; 

[inputStream setDelegate: self]; 
[outputStream setDelegate: self]; 

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
      forMode: NSDefaultRunLoopMode]; 
[inputStream open]; 

[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
       forMode:NSDefaultRunLoopMode]; 
[outputStream open]; 

가 갑자기 I 장치를 해제하는 것이 감지 할 NSNetServiceBrowser에게 거의 분이 소요
(이것은 소요 분 의 경우에는RemoveService가 호출되었습니다.

내가 통신하고 있지 않은 (스트림을 여는) 기기는 여전히 전화를 걸고 했습니다. 제거 된 서비스는입니다.

업데이트 : 다음은 내 문제와 관련된 정보입니다.

나는 Wireshark를 가진 추적을 실행하고이 다음 나타났습니다 :

내가 아이 패드 시뮬레이터 내 응용 프로그램을 시작, 응용 프로그램이 NSNetServiceBrowser를 시작하고 프린터를 감지합니다. 그런 다음 기기에 입력/출력 스트림 을 엽니 다 (airport express, usb를 통해). 프린터에서 상태 업데이트를 보내고 테스트 버튼을 누르면 프린터가 인쇄를 시작합니다. Wireshark에서는 프린터와의 모든 통신이 예상대로 이루어졌습니다.

이제 iPad에서 똑같은 응용 프로그램을 시작할 때 (그리고 iPad 시뮬레이터가 실행 중일 때). 응용 프로그램은 NSNetServiceBrowser도 시작하고 프린터를 감지합니다. 프린터가 상태 업데이트를 보내지 않으며 테스트 버튼을 누르면 프린터가 인쇄되지 않습니다. Wireshark에서 저는 의사 소통을 봅니다. 프린터 또는 공항에서 내 명령을 받고 ACK 패키지를 보냅니다.

iPad 시뮬레이터 앱을 종료하자마자 프린터가 iPad를 사용하여 보낸 명령 을 인쇄하기 시작합니다. 소켓을 열면 모든 bonjour 이벤트가 차단되는 것 같습니다. 어떻게 이런 일이 일어나지 않도록 할 수 있습니까? 여기

더 : https://devforums.apple.com/message/541436

+0

스트림을 닫으면 didRemoveService가 실행됩니다. 그것은 어떤 종류의 타임 아웃을 기다리고있는 것 같습니다. – Zyphrax

+0

이 경우인지 확실하지 않지만 - (void) stream : (NSStream *) aStream handleEvent : (NSStreamEvent) 이벤트 처리기를 살펴보십시오. Lion에서는 더 이상 NSStreamEventEndEncountered 이벤트에 대한 핸들러가 호출되지 않습니다. 따라서 모든 데이터를 받았으면 입력 스트림을 닫고 루프에서 제거해야합니다. 예를 들어, NSStreamEventHasBytesAvailable이 발생합니다. – Davyd

+0

Apple 개발자 포럼에 액세스 할 수있는 사용자. 내 문제는 여기에 게시했습니다 : https://devforums.apple.com/message/541436. 불행히도 아직 해결책이 없습니다 : ( – Zyphrax

답변

0

그것은 공항 익스프레스의 제한 인 것 같다.

현재 GCDAsyncSocket을 사용하여 구현 한 방법이 매우 효과적이므로 Airport Express와 통신하는 데 단 하나의 소켓 만 사용하면됩니다.

질문을 닫습니다.

0

나는 그것에서 사자 핸들러가 더 이상 NSStreamEventEndEncountered 이벤트에 대해 호출되지 않습니다 확신합니다. 따라서 모든 데이터를 받았으면 입력 스트림을 닫고 루프에서 제거해야합니다. 예를 들어, NSStreamEventHasBytesAvailable이 발생합니다. 그것을 확인하고 그것이 작동해야한다고 생각해.

+0

불행히도 장치 업데이트 (프린터 용지 부족, 트레이 열림 등)를 위해 입력 스트림을 열어 두어야합니다.이 문제는 Snow Leopard, iOS에서 발생합니다. Lion은별로 중요하지 않습니다. – Zyphrax