/// <summary> /// ネットワーク内の UPnP Wan サービスを探す。ちょっと時間がかかる。 /// 見つからなかったときはnullが返るので気をつける。 /// </summary> /// <returns></returns> public static UPnPWanService FindUPnPWanService() { Guid UPnPDeviceFinderClass = new Guid("E2085F28-FEB7-404A-B8E7-E659BDEAAA02"); IUPnPDeviceFinder finder = Activator.CreateInstance(Type.GetTypeFromCLSID(UPnPDeviceFinderClass)) as IUPnPDeviceFinder; string[] deviceTypes = { "urn:schemas-upnp-org:service:WANPPPConnection:1", "urn:schemas-upnp-org:service:WANIPConnection:1", }; string[] serviceNames = { "urn:upnp-org:serviceId:WANPPPConn1", "urn:upnp-org:serviceId:WANIPConn1", }; foreach (string deviceType in deviceTypes) { foreach (IUPnPDevice device in finder.FindByType(deviceType, 0)) { foreach (string serviceName in serviceNames) { foreach (IUPnPService service in device.Services) { return new UPnPWanService() { service = service } } } } } ; return(null); }
// Initiate UPNP discovery void SearchForDevices() { IntPtr pCB; // Create an instance of a UPNPFinder Type tFinder = Type.GetTypeFromCLSID(CLSID_UPnPFinder); object oInst = Activator.CreateInstance(tFinder); _finder = (IUPnPDeviceFinder)oInst; // Create a callback object _finderCallback = new Callback(this); pCB = Marshal.GetComInterfaceForObject(_finderCallback, typeof(IUPnPDeviceFinderCallback)); // Pin the callback to ensure it does not get garbage-collected _hCallback = GCHandle.Alloc(_finderCallback, GCHandleType.Pinned); // Start search _asyncFind = _finder.CreateAsyncFind("upnp:rootdevice", 0, pCB); Debug.WriteLine("Starting search"); _finder.StartAsyncFind(_asyncFind); }