Пример #1
0
        private async Task _SendAlertAsync(TAlertLevel alertLevel, TAlertDescription alertDescription, TimeSpan timeout)
        {
            if (this._Socket == null)
            {
                throw new Exception("Soket Cannot be Null");
            }

            var record = new DTLSRecord
            {
                RecordType     = TRecordType.Alert,
                Epoch          = _Epoch,
                SequenceNumber = this._NextSequenceNumber(),
                Version        = this._Version
            };

            var sequenceNumber = ((long)record.Epoch << 48) + record.SequenceNumber;

            var data = new byte[2];

            data[0]         = (byte)alertLevel;
            data[1]         = (byte)alertDescription;
            record.Fragment = this._Cipher == null ? data : this._Cipher.EncodePlaintext(sequenceNumber, (byte)TRecordType.ApplicationData, data, 0, data.Length);
            var recordSize  = DTLSRecord.RECORD_OVERHEAD + record.Fragment.Length;
            var recordBytes = new byte[recordSize];

            using (var stream = new MemoryStream(recordBytes))
            {
                record.Serialise(stream);
            }

            await this._Socket.SendAsync(recordBytes, timeout).ConfigureAwait(false);
        }
Пример #2
0
        private void SendAlert(TAlertLevel alertLevel, TAlertDescription alertDescription)
        {
            DTLSRecord record = new DTLSRecord
            {
                RecordType     = TRecordType.Alert,
                Epoch          = _Epoch,
                SequenceNumber = NextSequenceNumber()
            };

            if (_Version != null)
            {
                record.Version = _Version;
            }
            long sequenceNumber = ((long)record.Epoch << 48) + record.SequenceNumber;

            byte[] data = new byte[2];
            data[0] = (byte)alertLevel;
            data[1] = (byte)alertDescription;
            if (_Cipher == null)
            {
                record.Fragment = data;
            }
            else
            {
                record.Fragment = _Cipher.EncodePlaintext(sequenceNumber, (byte)TRecordType.ApplicationData, data, 0, data.Length);
            }
            int responseSize = DTLSRecord.RECORD_OVERHEAD + record.Fragment.Length;

            byte[] response = new byte[responseSize];
            using (MemoryStream stream = new MemoryStream(response))
            {
                record.Serialise(stream);
            }
            SocketAsyncEventArgs parameters = new SocketAsyncEventArgs()
            {
                RemoteEndPoint = _ServerEndPoint
            };

            parameters.SetBuffer(response, 0, responseSize);
            _Socket.SendToAsync(parameters);
        }
Пример #3
0
 private async Task _SendAlertAsync(TAlertLevel alertLevel, TAlertDescription alertDescription) =>
 await this._SendAlertAsync(alertLevel, alertDescription, TimeSpan.FromSeconds(1)).ConfigureAwait(false);
Пример #4
0
        private void SendAlert(TAlertLevel alertLevel, TAlertDescription alertDescription)
        {
            DTLSRecord record = new DTLSRecord();
            record.RecordType = TRecordType.Alert;
            record.Epoch = _Epoch;
            record.SequenceNumber = NextSequenceNumber();
            if (_Version != null)
                record.Version = _Version;
            long sequenceNumber = ((long)record.Epoch << 48) + record.SequenceNumber;

            byte[] data = new byte[2];
            data[0] = (byte)alertLevel;
            data[1] = (byte)alertDescription;
            if (_Cipher == null)
                record.Fragment = data;
            else
                record.Fragment = _Cipher.EncodePlaintext(sequenceNumber, (byte)TRecordType.ApplicationData, data, 0, data.Length);
            int responseSize = DTLSRecord.RECORD_OVERHEAD + record.Fragment.Length;
            byte[] response = new byte[responseSize];
            using (MemoryStream stream = new MemoryStream(response))
            {
                record.Serialise(stream);
            }
            SocketAsyncEventArgs parameters = new SocketAsyncEventArgs()
            {
                RemoteEndPoint = _ServerEndPoint
            };
            parameters.SetBuffer(response, 0, responseSize);
            _Socket.SendToAsync(parameters);
        }