private void ContinueRequest(IPEndPoint dest, string PQ, object Tag, HTTPMessage MSG) { HTTPMessage r; if (MSG == null) { r = new HTTPMessage(); r.Directive = "GET"; r.DirectiveObj = PQ; if (dest.AddressFamily == AddressFamily.InterNetwork) { r.AddTag("Host", dest.ToString()); } if (dest.AddressFamily == AddressFamily.InterNetworkV6) { r.AddTag("Host", "[" + RemoveIPv6Scope(dest.ToString()) + "]"); } } else { r = MSG; } lock (TagQueue) { IdleTimeout = false; KeepAliveTimer.Remove(GetHashCode()); if ((PIPELINE == false && _PIPELINE == false) || (_PIPELINE == false)) { HTTPRequest TR = new HTTPRequest(); TR.ProxySetting = ProxySetting; TR._PIPELINE = true; if (OnSniff != null) { TR.OnSniff += NonPipelinedSniffSink; } if (OnSniffPacket != null) { TR.OnSniffPacket += NonPipelinedSniffPacketSink; } TR.OnResponse += NonPipelinedResponseSink; NotPipelinedTable[TR] = TR; TR.PipelineRequest(dest, r, Tag); return; } TagQueue.Enqueue(new StateData(r, dest, Tag, null)); IPAddress localif = IPAddress.Any; if (dest.AddressFamily == AddressFamily.InterNetworkV6) { localif = IPAddress.IPv6Any; } if (s == null) { ReceivedFirstResponse = false; if (ProxySetting != null) { s = new HTTPSession(new IPEndPoint(localif, 0), ProxySetting, CreateSink, CreateFailedSink, null); } else { s = new HTTPSession(new IPEndPoint(localif, 0), dest, CreateSink, CreateFailedSink, null); } } else { if (s.IsConnected && ReceivedFirstResponse) { try { if (ProxySetting == null) { s.Send(r); } else { HTTPMessage pr = (HTTPMessage)r.Clone(); pr.DirectiveObj = "http://" + dest + pr.DirectiveObj; pr.Version = "1.0"; s.Send(pr); } } catch (Exception ex) { EventLogger.Log(ex); } } } } }
/// <summary> /// Searches for a SearchTarget Asynchronously /// </summary> /// <param name="SearchTarget">The Target</param> public void FindDeviceAsync(String SearchTarget, IPEndPoint RemoteEP) { HTTPMessage request = new HTTPMessage(); request.Directive = "M-SEARCH"; request.DirectiveObj = "*"; request.AddTag("ST", SearchTarget); request.AddTag("MX", MX.ToString()); request.AddTag("MAN", "\"ssdp:discover\""); if (RemoteEP.AddressFamily == AddressFamily.InterNetwork) { request.AddTag("HOST", RemoteEP.ToString()); // "239.255.255.250:1900" } if (RemoteEP.AddressFamily == AddressFamily.InterNetworkV6) { request.AddTag("HOST", string.Format("[{0}]:{1}", RemoteEP.Address.ToString(), RemoteEP.Port)); // "[FF05::C]:1900" } byte[] buffer = UTF8Encoding.UTF8.GetBytes(request.StringPacket); IPAddress[] LocalAddresses = NetInfo.GetLocalAddresses(); foreach (IPAddress localaddr in LocalAddresses) { try { UdpClient session = (UdpClient)SSDPSessions[localaddr]; if (session == null) { session = new UdpClient(new IPEndPoint(localaddr, 0)); session.EnableBroadcast = true; session.BeginReceive(OnReceiveSink, session); SSDPSessions[localaddr] = session; } if (RemoteEP.AddressFamily != session.Client.AddressFamily) { continue; } if ((RemoteEP.AddressFamily == AddressFamily.InterNetworkV6) && ((IPEndPoint)session.Client.LocalEndPoint).Address.IsIPv6LinkLocal && RemoteEP != Utils.UpnpMulticastV6EndPoint2) { continue; } if ((RemoteEP.AddressFamily == AddressFamily.InterNetworkV6) && ((IPEndPoint)session.Client.LocalEndPoint).Address.IsIPv6LinkLocal == false && RemoteEP != Utils.UpnpMulticastV6EndPoint1) { continue; } IPEndPoint lep = (IPEndPoint)session.Client.LocalEndPoint; if (session.Client.AddressFamily == AddressFamily.InterNetwork) { session.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, localaddr.GetAddressBytes()); } else if (session.Client.AddressFamily == AddressFamily.InterNetworkV6) { session.Client.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.MulticastInterface, BitConverter.GetBytes((int)localaddr.ScopeId)); } session.Send(buffer, buffer.Length, RemoteEP); session.Send(buffer, buffer.Length, RemoteEP); } catch (Exception ex) { EventLogger.Log(this, EventLogEntryType.Error, "CP Failure: " + localaddr.ToString()); EventLogger.Log(ex); } } }