public void LiberarSecuencia(TransactionUser ut, byte secuencia) { if (secuencias == null) { return; } secuencias.Enqueue(secuencia); }
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()); }
public void LiberarSecuencia(TransactionUser ut, byte secuencia) { secuencias.Enqueue(secuencia); }
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. } }