Exemplo n.º 1
0
        public void SendMessage(string NT, string USN, DvDevice rootDevice)
        {
            SimpleHTTPResponse response = new SimpleHTTPResponse(HTTPResponseCode.Ok);

            response.SetHeader("CACHE-CONTROL", "max-age = " + _serverData.AdvertisementExpirationTime);
            response.SetHeader("DATE", DateTime.Now.ToUniversalTime().ToString("R"));
            response.SetHeader("EXT", string.Empty);
            response.SetHeader("SERVER", UPnPConfiguration.UPnPMachineInfoHeader);
            response.SetHeader("ST", NT);
            response.SetHeader("USN", USN);
            response.SetHeader("BOOTID.UPNP.ORG", _serverData.BootId.ToString());
            response.SetHeader("CONFIGID.UPNP.ORG", _localEndpointConfiguration.ConfigId.ToString());
            if (_localEndpointConfiguration.AddressFamily == AddressFamily.InterNetworkV6)
            {
                response.SetHeader("OPT", "\"http://schemas.upnp.org/upnp/1/0/\"; ns=01");
                response.SetHeader("01-NLS", _serverData.BootId.ToString());
            }
            if (_localEndpointConfiguration.SSDPUsesSpecialSearchPort)
            {
                response.SetHeader("SEARCHPORT.UPNP.ORG", _localEndpointConfiguration.SSDPSearchPort.ToString());
            }

            response.SetHeader("LOCATION", _localEndpointConfiguration.GetRootDeviceDescriptionURL(rootDevice));
            byte[] bytes  = response.Encode();
            Socket socket = _localEndpointConfiguration.SSDP_UDP_UnicastSocket;

            if (socket != null)
            {
                NetworkHelper.SendData(socket, _receiverEndPoint, bytes, 1);
            }
        }
        private void OnSSDPUnicastReceive(IAsyncResult ar)
        {
            lock (_cpData.SyncObj)
                if (!_isActive)
                {
                    return;
                }
            UDPAsyncReceiveState <EndpointConfiguration> state = (UDPAsyncReceiveState <EndpointConfiguration>)ar.AsyncState;
            EndpointConfiguration config = state.Endpoint;
            Socket socket = config.SSDP_UDP_UnicastSocket;

            if (socket == null)
            {
                return;
            }
            try
            {
                EndPoint remoteEP = new IPEndPoint(state.Endpoint.AddressFamily == AddressFamily.InterNetwork ?
                                                   IPAddress.Any : IPAddress.IPv6Any, 0);
                Stream stream = new MemoryStream(state.Buffer, 0, socket.EndReceiveFrom(ar, ref remoteEP));
                try
                {
                    SimpleHTTPResponse header;
                    SimpleHTTPResponse.Parse(stream, out header);
                    HandleSSDPResponse(header, config, (IPEndPoint)remoteEP);
                }
                catch (Exception e)
                {
                    UPnPConfiguration.LOGGER.Debug("SSDPClientController: Problem parsing incoming unicast UDP packet. Error message: '{0}'", e.Message);
                }
                StartUnicastReceive(state);
            }
            catch (Exception) // SocketException, ObjectDisposedException
            {
                // Socket was closed - ignore this exception
                UPnPConfiguration.LOGGER.Info("SSDPClientController: Stopping listening for unicast messages at address '{0}'",
                                              NetworkHelper.IPAddrToString(config.EndPointIPAddress));
            }
        }
        protected void HandleSSDPResponse(SimpleHTTPResponse header, EndpointConfiguration config, IPEndPoint remoteEndPoint)
        {
            HTTPVersion httpVersion;

            if (!HTTPVersion.TryParse(header.HttpVersion, out httpVersion))
            {
                // Invalid response
                return;
            }
            string cacheControl = header["CACHE-CONTROL"];
            string date         = header["DATE"];
            // EXT is not used
            //string ext = header["EXT"];
            string location = header["LOCATION"];
            string server   = header["SERVER"];
            // ST is not used
            //string st = header["ST"];
            string usn = header["USN"];
            string bi  = header["BOOTID.UPNP.ORG"];
            string ci  = header["CONFIGID.UPNP.ORG"];
            string sp  = header["SEARCHPORT.UPNP.ORG"];

            HandleNotifyPacket(config, remoteEndPoint, httpVersion, date, cacheControl, location, server, "ssdp:alive", usn, bi, ci, sp);
        }