예제 #1
0
 // Guarda una estación
 public void PutStation(IPEndPoint NumEndPoint, CStationInfoUDP NewStation)
 {
     if (NumEndPoint != null)                   // Si no existe no guardar y esperar mensaje de error
     {
         NewStation.HourCreated = DateTime.Now; // también se guarda la hora en la que se guardó
         StationTableInt.Add(NumEndPoint, NewStation);
     }
 }
예제 #2
0
 private void m_Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
 {
     lock (LockTimer)
     {
         bool Cont = false;
         // Continuamente se buscan estaciones JBC
         m_SockUDP.SendBroadcast(Encoding.ASCII.GetBytes(SearcherServicesData.MESSAGE_STATION_DISCOVERY_REQUEST), SearcherServicesData.PORT_STATION_DISCOVERY);
         // Chequea todas las estaciones
         do
         {
             try
             {
                 foreach (DictionaryEntry tableStation in m_StationHashTable.GetTable)
                 {
                     DateTime HoraActual = default(DateTime);
                     DateTime HoraLimite = default(DateTime);
                     // Hora actual
                     HoraActual = DateTime.Now;
                     CStationInfoUDP Station    = (CStationInfoUDP)tableStation.Value;
                     IPEndPoint      IDTerminal = (IPEndPoint)tableStation.Key;
                     HoraLimite = Station.HourCreated.AddMilliseconds(TIMER_DELETE_CONNECT);
                     if (HoraActual > HoraLimite)
                     {
                         // Ha superado el tiempo de espera sin que la estación responda, se ha de eliminar de la tabla
                         m_StationHashTable.RemoveStation(IDTerminal); //eliminamos la estación
                         ChangeTable = true;
                     }
                 }
                 Cont = false;
             }
             catch (Exception)
             {
                 // Si se produce la excepción debe volverse a repetir ya que se ha quitado un elemento y pueden haber más
                 Cont = true;
             }
         } while (Cont);
         // Cada vez que pasa el tiempo del timer se informa si han habido cambios en la tabla
         // tanto de añadir nuevas estaciones como de quitat estaciones
         // no se puede informar en "DataReceived" porque se podría activar el evento varias veces seguidad
         if (ChangeTable)
         {
             ChangeTable = false;
             if (RefreshEvent != null)
             {
                 RefreshEvent();
             }
         }
         m_Timer.Start(); //Este timer se desactiva siempre al entrar y se debe hacer un start siempre qu se salga
     }
 }
예제 #3
0
 public CStationHashtableUDP(IPEndPoint NumEndPoint, CStationInfoUDP NewStation)
 {
     StationTableInt.Clear();
     PutStation(NumEndPoint, NewStation);
 }
예제 #4
0
        private void m_SockUDP_DataReceived(byte[] Data, IPEndPoint IDTerminal)
        {
            lock (LockReceived)
            {
                CStationInfoUDP Station    = default(CStationInfoUDP);
                string          StringData = System.Text.Encoding.UTF8.GetString(Data);
                //Debug.Print("UDP data: " & StringData)
                string[] SplitStringData = StringData.Split(':');
                if (SplitStringData.Length >= (POS_CONN_TYPE + INC_CONN_NAME_PC + 1) && SplitStringData[POS_CONNECTION_TEXT].ToUpperInvariant() == SearcherServicesData.MESSAGE_STATION_DISCOVERY_REQUEST)
                {
                    int NumConnection = System.Convert.ToInt32((SplitStringData.Length - POS_CONN_TYPE) / INC_CONN_NEXT);
                    if (m_StationHashTable.ExistsStation(IDTerminal))
                    {
                        // Si ya existe se quita y se vuelve a añadir,
                        // para renovar su hora para el control de bajas de equipos
                        // y los datos de conexión actualizados
                        Station = m_StationHashTable.GetStation(IDTerminal);
                        m_StationHashTable.RemoveStation(IDTerminal);
                    }
                    else
                    {
                        // Si no existe crear la estación
                        Station = new CStationInfoUDP(NumConnection - 1);
                        Station.StationInfo.IPEndPointValue = IDTerminal;
                        Station.StationInfo.ProtocolVersion = SplitStringData[POS_PROTOCOL_VERSION];
                        Station.StationInfo.StationModel    = SplitStringData[POS_STATION_TYPE];
                        Station.StationInfo.SoftVersion     = SplitStringData[POS_SOFT_VERSION];
                        Station.StationInfo.HardVersion     = SplitStringData[POS_HARD_VERSION];
                        ChangeTable = true;
                    }
                    // actualizar datos de conexión
                    int count = 0;
                    for (int index = POS_CONN_TYPE; index <= (NumConnection * INC_CONN_NEXT) + POS_CONN_TYPE - 1; index += INC_CONN_NEXT)
                    {
                        if (SplitStringData[index + INC_CONN_TYPE].Length > 0 &&
                            SplitStringData[index + INC_CONN_STATUS].Length == 1 &&
                            SplitStringData[index + INC_CONN_NAME_PC].Length > 0)
                        {
                            // Se comprueba una mínima de integridad
                            if (!(System.Enum.IsDefined(typeof(EnumConnection), SplitStringData[index + INC_CONN_TYPE].ToUpper())))
                            {
                                // Si no existe el tipo de conexión considerar no conectado
                                Array.Resize(ref Station.StationInfo.Connection, Station.StationInfo.Connection.Length - 2 + 1);
                                continue;
                            }

                            //"N" --> sin conexión; "M" --> conectado Monitor Mode; "C" --> conectado Control Mode
                            switch (char.ToUpper(System.Convert.ToChar(SplitStringData[index + INC_CONN_STATUS][0])))
                            {
                            case 'N':
                                Station.StationInfo.Connection[count].Status         = EnumStado.NO_CONNECT;
                                Station.StationInfo.Connection[count].ConnectionType = (CSearchUDP.EnumConnection)((EnumConnection)(System.Enum.Parse(typeof(EnumConnection), SplitStringData[index + INC_CONN_TYPE].ToUpper())));
                                Station.StationInfo.Connection[count].NamePC         = "";
                                break;

                            case 'M':
                                Station.StationInfo.Connection[count].Status         = EnumStado.MONITOR_MODE;
                                Station.StationInfo.Connection[count].ConnectionType = (CSearchUDP.EnumConnection)((EnumConnection)(System.Enum.Parse(typeof(EnumConnection), SplitStringData[index + INC_CONN_TYPE].ToUpper())));
                                Station.StationInfo.Connection[count].NamePC         = SplitStringData[index + INC_CONN_NAME_PC];
                                break;

                            case 'C':
                                Station.StationInfo.Connection[count].Status         = EnumStado.CONTROL_MODE;
                                Station.StationInfo.Connection[count].ConnectionType = (CSearchUDP.EnumConnection)((EnumConnection)(System.Enum.Parse(typeof(EnumConnection), SplitStringData[index + INC_CONN_TYPE].ToUpper())));
                                Station.StationInfo.Connection[count].NamePC         = SplitStringData[index + INC_CONN_NAME_PC];
                                break;

                            default:
                                // esto no se ha de producir, si pasa no añadir nada
                                Array.Resize(ref Station.StationInfo.Connection, Station.StationInfo.Connection.Length - 1);
                                continue;
                            }
                        }
                        count++;
                    }
                    // Se guarda la estación detectada
                    m_StationHashTable.PutStation(IDTerminal, Station);
                }
            }
        }