public async Task SendMSearchAsync(IMSearchRequest mSearch) { if (mSearch.SearchCastMethod == CastMethod.Multicast) { await _httpListener.SendOnMulticast(ComposeMSearchDatagram(mSearch)); } if (mSearch.SearchCastMethod == CastMethod.Unicast) { await SendOnTcp(mSearch.HostIp, mSearch.HostPort, ComposeMSearchDatagram(mSearch)); } }
private static byte[] ComposeMSearchDatagram(IMSearchRequest request) { var stringBuilder = new StringBuilder(); stringBuilder.Append("M-SEARCH * HTTP/1.1\r\n"); stringBuilder.Append(request.SearchCastMethod == CastMethod.Multicast ? "HOST: 239.255.255.250:1900\r\n" : $"HOST: {request.HostIp}:{request.HostPort}\r\n"); stringBuilder.Append("MAN: \"ssdp:discover\"\r\n"); if (request.SearchCastMethod == CastMethod.Multicast) { stringBuilder.Append($"MX: {request.MX.TotalSeconds}\r\n"); } stringBuilder.Append($"ST: {request.ST}\r\n"); stringBuilder.Append($"USER-AGENT: " + $"{request.UserAgent.OperatingSystem}/{request.UserAgent.OperatingSystemVersion}" + $" " + $"UPnP/{request.UserAgent.UpnpMajorVersion}.{request.UserAgent.UpnpMinorVersion}" + $" " + $"{request.UserAgent.ProductName}/{request.UserAgent.ProductVersion}\r\n"); if (request.SearchCastMethod == CastMethod.Multicast) { stringBuilder.Append($"CPFN.UPNP.ORG: {request.CPFN}\r\n"); HeaderHelper.AddOptionalHeader(stringBuilder, "TCPPORT.UPNP.ORG", request.TCPPORT); HeaderHelper.AddOptionalHeader(stringBuilder, "CPUUID.UPNP.ORG", request.CPUUID); if (request.Headers != null) { foreach (var header in request.Headers) { stringBuilder.Append($"{header.Key}: {header.Value}\r\n"); } } } stringBuilder.Append("\r\n"); return(Encoding.UTF8.GetBytes(stringBuilder.ToString())); }
public async Task SendMSearchResponseAsync(IMSearchResponse mSearchResponse, IMSearchRequest mSearchRequest) { var wait = new Random(); await Task.Delay(TimeSpan.FromMilliseconds(wait.Next(50, (int)mSearchRequest.MX.TotalMilliseconds))); if (mSearchResponse.ResponseCastMethod != CastMethod.Unicast) { await _httpListener.SendOnMulticast(ComposeMSearchResponseDatagram(mSearchResponse)); } if (int.TryParse(mSearchRequest.TCPPORT, out int tcpSpecifiedRemotePort)) { await SendOnTcp(mSearchRequest.HostIp, tcpSpecifiedRemotePort, ComposeMSearchResponseDatagram(mSearchResponse)); } else { await SendOnTcp(mSearchRequest.HostIp, mSearchRequest.HostPort, ComposeMSearchResponseDatagram(mSearchResponse)); } }
public async Task MSearchResponse(IMSearchResponse mSearchResponse, IMSearchRequest mSearchRequest) { await SendMSearchResponseAsync(mSearchResponse, mSearchRequest); }