2012-09-04 17 views
3

我正在开发一个使用Bonjour算法在网络中查找服务的程序。我下载了Bonjour SDK for Windows。 .Net上有两个示例应用程序。两者都是Windows Forms项目。示例工作正常,但是当我试图实现示例控制台应用程序时,我收到AccessViolationException。 这里是我的代码:适用于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 
    } 
} 

我找到了解决方案 - 从卓悦库中的所有方法应该从STA线程调用。所以我给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但收到一个新的问题。 在我调用方法Browse之后,应该为网络中定义的每个服务调用'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("----------------------------------------"); 

     } 



    } 
} 
相关问题