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().
당신은 나를 많이 도왔습니다 !! 'eventManager_ServiceFound'에서 IP 주소와 포트를 얻는 방법을 알고 있습니까? – Yoda