示例#1
0
        /// <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);
        }
示例#2
0
 /// <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;
 }
示例#3
0
 /// <summary>
 /// Reset all struct members
 /// </summary>
 public void Reset()
 {
     PacketType    = 0;
     PayloadLength = 0;
     Sequence      = 0;
     PacketFlag    = 0;
     OptionFlag    = 0;
 }
示例#4
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();
        }
示例#5
0
        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));
                    }
                }
            }
        }