Пример #1
0
 public void LiberarSecuencia(TransactionUser ut, byte secuencia)
 {
     if (secuencias == null)
     {
         return;
     }
     secuencias.Enqueue(secuencia);
 }
Пример #2
0
 public byte TomarSecuencia(TransactionUser ut)
 {
     if (secuencias == null)
     {
         // inicializo la tabla de secuencias.
         // esto ocurre una vez por Destino.
         secuencias = new Queue <byte>();
         for (var i = ut.LimiteInferiorSeq; i < ut.LimiteSuperiorSeq; i++)
         {
             secuencias.Enqueue(i);
         }
     }
     return(secuencias.Dequeue());
 }
Пример #3
0
 public void LiberarSecuencia(TransactionUser ut, byte secuencia)
 {
     secuencias.Enqueue(secuencia);
 }
Пример #4
0
        private void _ReadCallback(IAsyncResult ar)
        {
            try
            {
                _read_bytes = _socket.EndReceiveFrom(ar, ref _remote_address);
                if (HACK_DisableSocketRead)
                {
                    T.INFO(string.Format("udp reactor, hackeado, tamaño={0}", _read_bytes));
                    _socket.BeginReceiveFrom(_read_buffer, 0, _buffersize, 0, ref _remote_address, _ReadCallback,
                                             _socket);
                    return;
                }
                T.TRACE(string.Format("UDP: reactor, recibio datagrama de size={0}", _read_bytes));
                try
                {
                    T.TRACE("---RECEIVING---------------------------------------------------------------");

                    var ret             = Decoder.DecodeErrors.NoError;
                    var instance_buffer = new byte[get_read_bytes()];
                    Array.Copy(get_buffer(), instance_buffer, get_read_bytes());
                    var pdu = Decoder.Decode(instance_buffer, ref ret);
                    pdu.Transport       = this;
                    pdu.Destination     = new Destination();
                    pdu.Destination.UDP = _remote_address as IPEndPoint;

                    T.TRACE(pdu.Trace(""));
                    Transaction t;
                    t = ObtenerTransaccion(pdu.TransactionId);
                    T.TRACE("UDP: trid=" + pdu.TransactionId);
                    if (t == null)
                    {
                        TransactionUser ut = null;
                        // Options 0 = mensaje de dispositivo.
                        if (pdu.Options == 0x00)
                        {
                            T.TRACE("UDP: transaccion de usuario. ");
                            ut = TransactionUser;
                        }
                        // Options 1 = mensaje de control de red.
                        else if (pdu.Options == 0x01)
                        {
                            T.TRACE("UDP: transaccion para modulo de managment ch=" + pdu.CH);
                            ut = Managment;
                        }

                        if (ut != null && pdu.CH < 0x80)
                        {
                            T.TRACE("UDP: transaccion nueva ch=" + pdu.CH);
                            var mrs = new MRS(pdu, this, ut);
                            NuevaTransaccion(mrs, pdu);
                            mrs.Start();
                        }
                        else
                        {
                            T.TRACE("UDP: pdu huerfana seq=" + pdu.Seq + " CH=" + pdu.CH + " CL=" + pdu.CL);
                        }
                    }
                    else
                    {
                        T.TRACE("UDP: transaccion existente recibe PDU");
                        t.ReceivedPDU(pdu);
                    }
                }
                catch (Exception e)
                {
                    T.TRACE(
                        string.Format("UDP: exception procesando PDU, local_address={1} remote address={0} texto={2}",
                                      _remote_address, _local_address, e));
                }
                finally
                {
                    T.TRACE("---------------------------------------------------------------------------");
                    _socket.BeginReceiveFrom(_read_buffer, 0, _buffersize, 0, ref _remote_address, _ReadCallback,
                                             _socket);
                }
            }
            catch (ObjectDisposedException)
            {
                // se ignora como excepcion, ya que se dispara por invocar Close del socket.
                T.TRACE(string.Format("excepcion, se asume que el reactor de udp esta detenido, address={0}",
                                      _local_address));
            }
            catch (SocketException)
            {
                // se ignora por problemas de red.
            }
        }