// 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); } }
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 } }
public CStationHashtableUDP(IPEndPoint NumEndPoint, CStationInfoUDP NewStation) { StationTableInt.Clear(); PutStation(NumEndPoint, NewStation); }
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); } } }