2012-09-04 5 views
3

Bonjour 알고리즘을 사용하여 네트워크에서 서비스를 찾는 프로그램을 개발 중입니다. Bonjour SDK for Windows을 다운로드했습니다. .Net에는 두 가지 샘플 응용 프로그램이 있습니다. 둘 다 Windows Forms 프로젝트입니다. 샘플은 잘 작동하지만 샘플 콘솔 애플리케이션을 구현하려고 할 때 AccessViolationException을 수신했습니다. - 봉쥬르 라이브러리에서 모든 방법을 STA 스레드에서 호출해야 Windows 용 Bonjour SDK가 UI 스레드에서만 실행 중입니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     DNSSDService service = new DNSSDService(); 
     DNSSDEventManager eventManager = new DNSSDEventManager(); 
     eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound); 
     //next line raises AccessViolationException 
     DNSSDService browse = service.Browse(0, 0, "_psia._tcp", null, eventManager); 

     Console.ReadKey(); 
    } 

    static void eventManager_ServiceFound(DNSSDService browser, DNSSDFlags flags, uint ifIndex, string serviceName, string regtype, string domain) 
    { 
     //TODO: some logic 
    } 
} 

내가 해결책을 발견 : 다음은 내 코드입니다. 그래서 Main 메소드에 [STAThread] 속성을 추가했습니다. 이제 코드는 다음과 같습니다.

class Program 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
     DNSSDService service = new DNSSDService(); 
     DNSSDEventManager eventManager = new DNSSDEventManager(); 
     eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound); 
     DNSSDService browse = service.Browse(0, 0, "_psia._tcp", null, eventManager); 

     Console.ReadKey(); 
    } 

    static void eventManager_ServiceFound(DNSSDService browser, DNSSDFlags flags, uint ifIndex, string serviceName, string regtype, string domain) 
    { 
     //TODO: some logic 
    } 
} 

AccessViolationException 문제가 해결되었지만 새 코드를 받았습니다. 메소드 찾아보기를 호출 한 후 네트워크에 정의 된 각 서비스에 대해 'ServiceFound'이벤트를 호출해야합니다. 그러나 그렇지 않았습니다. 수사 시간이 지나면 나는이 모든 사건을 받아들이 기 위해 메시지 펌프를 가동해야한다는 것을 알게되었습니다. 따라서 최종 코드는 다음과 같습니다.

class Program 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
     DNSSDService service = new DNSSDService(); 
     DNSSDEventManager eventManager = new DNSSDEventManager(); 
     eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound); 
     DNSSDService browse = service.Browse(0, 0, "_psia._tcp", null, eventManager); 

     Application.Run(); 
    } 

    static void eventManager_ServiceFound(DNSSDService browser, DNSSDFlags flags, uint ifIndex, string serviceName, string regtype, string domain) 
    { 
     //TODO: some logic 
    } 
} 

메시지 루프 호출을 중지하려면 Application.Exit().

+0

당신은 나를 많이 도왔습니다 !! 'eventManager_ServiceFound'에서 IP 주소와 포트를 얻는 방법을 알고 있습니까? – Yoda

답변

0

IP 카메라의 IP 주소를 알아 내기 위해 코드를 사용하려고했지만 hostName이 무엇인지 모르겠으므로 GetAddrInfo을 사용해야합니다.

using Bonjour; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 { 
    static class Program { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() { 
      DNSSDService service = new DNSSDService(); 
      DNSSDEventManager eventManager = new DNSSDEventManager(); 
      eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(eventManager_ServiceFound); 
     // DNSSDService browse = service.Browse(0, 0, "_axis-video._tcp", null, eventManager); 
      DNSSDService browse = service.Browse(0, 0, "_http._tcp", null, eventManager); 


      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 
     static void eventManager_ServiceFound(DNSSDService browser, DNSSDFlags flags, uint ifIndex, string serviceName, string regtype, string domain) { 
      Console.WriteLine("browser: " + browser + "\nDNSSDFlags " + flags+ "\nifIndex " + ifIndex +"\nserviceName: " + serviceName + "\nregtype: " +regtype+ "\ndomain: "+ domain); 

      DNSSDEventManager eventManager = new DNSSDEventManager(); 
      eventManager.AddressFound += new _IDNSSDEvents_AddressFoundEventHandler(eventManager_AddressFound); 
      DNSSDAddressFamily family = new DNSSDAddressFamily(); 
      browser.GetAddrInfo(flags, ifIndex, family, "axis-00408cbeeae5", eventManager); 

     } 

     private static void eventManager_AddressFound(DNSSDService service, DNSSDFlags flags, uint ifIndex, string hostname, DNSSDAddressFamily addressFamily, string address, uint ttl) { 
      Console.WriteLine("----------------------------------------"); 
      Console.WriteLine("FFFFFFFFFFFFFFFFFFFFFOUUUUUUUUUUUUUUUUND"); 
      Console.WriteLine("----------------------------------------"); 

     } 



    } 
}