/// <summary> /// Creates a serialized request packet (DtmPacket) /// </summary> private MemoryStream CreateRequest(DtmPacketFlags Message, short State) { MemoryStream ret = new DtmPacketStruct(Message, 0, 0, State).ToStream(); ret.Seek(0, SeekOrigin.Begin); return(ret); }
/// <summary> /// DtmPacketStruct primary constructor /// </summary> /// /// <param name="PacketType">The <see cref="DtmPacketFlags"/> message type; describes the packet classification</param> /// <param name="PayloadLength">The length of the payload contained in the packet</param> /// <param name="Sequence">The packet sequence number</param> /// <param name="PacketFlag">The <see cref="DtmServiceFlags"/> exchange state; indicates the exchange state position</param> /// <param name="OptionFlag">The packet header option flag</param> public DtmPacketStruct(DtmPacketFlags PacketType, long PayloadLength, int Sequence, short PacketFlag, long OptionFlag = 0) { this.PacketType = PacketType; this.PayloadLength = PayloadLength; this.Sequence = Sequence; this.PacketFlag = PacketFlag; this.OptionFlag = OptionFlag; }
/// <summary> /// Reset all struct members /// </summary> public void Reset() { PacketType = 0; PayloadLength = 0; Sequence = 0; PacketFlag = 0; OptionFlag = 0; }
/// <summary> /// Extracts a DtmPacket from a Stream /// </summary> /// /// <param name="PacketStream">The Stream containing the DtmPacket structure</param> public DtmPacketStruct(Stream PacketStream) { BinaryReader reader = new BinaryReader(PacketStream); PacketType = (DtmPacketFlags)reader.ReadUInt16(); PayloadLength = reader.ReadInt64(); Sequence = reader.ReadInt32(); PacketFlag = reader.ReadInt16(); OptionFlag = reader.ReadInt64(); }
private void Transmit(DtmPacketFlags PacketType, short PacketFlag, long OptionFlag = 0, MemoryStream Payload = null) { lock (_sndLock) { long pldLen = Payload == null ? 0 : Payload.Length; // create a new packet: packet flag, payload size, sequence, and state flag MemoryStream pktStm = new DtmPacketStruct(PacketType, pldLen, _sndSequence, PacketFlag, OptionFlag).ToStream(); // add payload if (Payload != null) { // copy to output pktStm.Seek(0, SeekOrigin.End); Payload.WriteTo(pktStm); pktStm.Seek(0, SeekOrigin.Begin); } // store in the file packet buffer _sndBuffer.Push(_sndSequence, pktStm); // increment file send counter _sndSequence++; // transmit to remote client if (_clientSocket.IsConnected) { try { _clientSocket.SendAsync(pktStm); } catch (CryptoSocketException ce) { SocketException se = ce.InnerException as SocketException; if (se.SocketErrorCode == SocketError.WouldBlock || se.SocketErrorCode == SocketError.IOPending || se.SocketErrorCode == SocketError.NoBufferSpaceAvailable) { // buffer is full, throttle down Throttle(pktStm); } else { // possible connection dropped, alert app if (SessionError != null) { DtmErrorArgs args = new DtmErrorArgs(ce, DtmErrorSeverityFlags.Connection); SessionError(this, args); } } } catch (Exception ex) { // possible connection dropped, alert app if (SessionError != null) { DtmErrorArgs args = new DtmErrorArgs(ex, DtmErrorSeverityFlags.Connection); SessionError(this, args); } } // notify app if (PacketSent != null) { PacketSent(this, new DtmPacketArgs((short)DtmTransferFlags.DataChunk, pldLen)); } } } }