public RtmpClient(RtmpConnectionRequest Request) { RtmpRequest = Request; ProtocolClient.NoDelay = Request.ProtocolConfigurations.NoDelay; ProtocolClient.ExclusiveAddressUse = Request.ProtocolConfigurations.ExclusiveAddressUse; if (!Request.ProtocolConfigurations.ReceiveTimeout.Equals(0)) { ProtocolClient.ReceiveTimeout = Request.ProtocolConfigurations.ReceiveTimeout; } if (!Request.ProtocolConfigurations.SendTimeout.Equals(0)) { ProtocolClient.SendTimeout = Request.ProtocolConfigurations.SendTimeout; } if (!Request.ProtocolConfigurations.RecieveBufferSize.Equals(0)) { ProtocolClient.ReceiveBufferSize = Request.ProtocolConfigurations.RecieveBufferSize; } if (!Request.ProtocolConfigurations.SendBufferSize.Equals(0)) { ProtocolClient.SendBufferSize = Request.ProtocolConfigurations.SendBufferSize; } }
public static async Task ValidateClientRequestAsync(this TcpClient client, RtmpConnectionRequest request) { Task task = Task.Run(() => { // Validation Steps: // Validate URI Scheme Request // * Validate EnableSsl matches with Protocol Type RTMPs (cannot be RTMP) }); await task; }
// [FInished] : Connection Complete public async Task ConnectAsync(RtmpConnectionRequest Request) { RtmpRequest = Request; ProtocolClient.NoDelay = Request.ProtocolConfigurations.NoDelay; ProtocolClient.ExclusiveAddressUse = Request.ProtocolConfigurations.ExclusiveAddressUse; if (Request.ProtocolConfigurations.ReceiveTimeout != -1) { ProtocolClient.ReceiveTimeout = Request.ProtocolConfigurations.ReceiveTimeout; } if (Request.ProtocolConfigurations.SendTimeout != -1) { ProtocolClient.SendTimeout = Request.ProtocolConfigurations.SendTimeout; } if (Request.ProtocolConfigurations.RecieveBufferSize != -1) { ProtocolClient.ReceiveBufferSize = Request.ProtocolConfigurations.RecieveBufferSize; } if (Request.ProtocolConfigurations.SendBufferSize != -1) { try { // Step 01: Make connection to socket on Server-Side TCP Listener if URI Schema is valid await ProtocolClient.ValidateClientRequestAsync(RtmpRequest); // Step 02: Connect to Host Socket await ProtocolClient.ConnectAsync(RtmpRequest.Content.RtmpUri.Host, RtmpRequest.Content.RtmpUri.Port != -1?RtmpRequest.Content.RtmpUri.Port : DefaultPort); // Step 03: Validate Socket Connection await ProtocolClient.ValidateClientConnectionAsync(RtmpRequest.ProtocolConfigurations); // Step 04: Set the Resolved Stream RtmpStream = await ProtocolClient.ResolveStreamTypeAsync(RtmpRequest); // Step 05: Validate Stream Properties Match with request await RtmpStream.ValidateStreamPropertiesAsync(RtmpRequest.StreamConfigurations); // Step 06: Initialize the Handshake Sequence await RtmpStream.InitializeHandshakeSequenceAsync(StopToken); } catch (Exception exception) { throw new Exception("Connection was unsuccessful.", exception); } } }
// [Finished] : Create eiter a SSL Stream or standard Network Stream public static async Task <Stream> ResolveStreamTypeAsync(this TcpClient protocol, RtmpConnectionRequest request) { Stream NetStream = protocol.GetStream(); if (request.StreamConfigurations.EnableSsl.Equals(true)) { // Request a Callback Delegate to Vallidate Remote Certificate RemoteCertificateValidationCallback ValidationCallback = (sender, certificate, chain, errors) => true; // Instantiate a New SSL Stream [Transfer Current Stream to SSL Stream then close] SslStream Sslstream = new SslStream(NetStream, false, ValidationCallback); // Authenticate Server through Client Request [Set Configure Await to 'True' to return context before returning stream] await Sslstream.AuthenticateAsClientAsync(request.Content.RtmpUri.Host).ConfigureAwait(true); return(Sslstream); } else { return(NetStream); } }