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); }