void connection_ServerError(object sender, args.ServerErrorEventsArgs e) { switch (e.ErrorCode) { case ServerErrorEventsArgs.SERVER_ERROR: ErrorMessage("Problema con la rete del Server " + e.Server.Name); serverAggiunti.Remove(e.Server); serverTrovati.Remove(e.Server); break; case ServerErrorEventsArgs.NETWORK_ERROR: ErrorMessage("Connessione assente!"); serverAggiunti.Clear(); serverTrovati.Clear(); break; case ServerErrorEventsArgs.KEEP_ALIVE_NOT_RECEIVED: ErrorMessage("Problemi di connessione col Server " + e.Server.Name); serverAggiunti.Remove(e.Server); serverTrovati.Remove(e.Server); break; case ServerErrorEventsArgs.LOGIN_ERROR: ErrorMessage("Errore nella fase di LOGIN col server:\n " + e.Server.Name); break; case ServerErrorEventsArgs.PASSWORD_ERROR: ErrorMessage("Password errata!"); break; default: ErrorMessage("Si è verificato un errore inatteso"); break; } }
void connection_ServerError(object sender, args.ServerErrorEventsArgs e) { switch (e.ErrorCode) { case ServerErrorEventsArgs.SERVER_ERROR: case ServerErrorEventsArgs.KEEP_ALIVE_NOT_RECEIVED: if (e.Position < 0 || e.Position >= serverTiles.Count) { Trace.TraceError("Posizione è fuori range. Pisition:{0} Length:{1}. In connection_ServerError()", e.Position, serverTiles.Count); } else { //rimuovo dalla lista dei server servers.RemoveAt(e.Position); //rimuovo la tile ServerTileUserControl tile1 = serverTiles[e.Position]; stackPanel.Children.Remove(tile1); serverTiles.RemoveAt(e.Position); } ErrorMessage("Problema con la rete del Server " + e.Server.Name); if (servers.Count == 0) { this.Close(); } break; case ServerErrorEventsArgs.NETWORK_ERROR: ErrorMessage("Connessione assente!"); //rimuovo dalla lista dei server servers.Clear(); this.Close(); break; case ServerErrorEventsArgs.CLIPBOARD_IN_ACTION: ErrorMessage("Impossibile effettuare lo switch durante il trasferimento!"); break; default: ErrorMessage("Si è verificato un errore inatteso"); this.Close(); break; } }
void connectServerWorker_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; NetworkStream stream = null; Server server = null; cancellationTokenSource = new CancellationTokenSource(); while (!worker.CancellationPending) { try { serverInConnessione.TryTake(out server, -1, cancellationTokenSource.Token); //connessione TCP con Server server.TCPControlChannel = new TcpClient(server.IP, server.ControlPort); stream = server.TCPControlChannel.GetStream(); stream.ReadTimeout = TIMEOUT; //invio richiesta di login byte[] reqLogin = Encoding.ASCII.GetBytes(TipoComando.REQUEST_LOGIN); WriteMessage(stream, reqLogin, 0, reqLogin.Length); //aspetto di ricevere la conferma di richiesta insieme alla string sfida byte[] challengeMessage = new byte[1024]; ReadMessage(stream, challengeMessage, 0, 6); String messageString = Encoding.ASCII.GetString(challengeMessage, 0, 6); if (messageString.Equals(TipoComando.LOGIN_CHALLENGE)) { //leggo il nonce byte[] challenge = new byte[1024]; stream.Read(challenge, 0, 4); if (server.Password != null) { String password = server.Password; server.Password = null; //concateno pasword e challenge byte[] passwordBytes = new byte[password.Length + 4]; Array.Copy(Encoding.ASCII.GetBytes(password), passwordBytes, password.Length); Array.Copy(challenge, 0, passwordBytes, password.Length, 4); //calcolo l'hash SHA256 sha = SHA256Managed.Create(); byte[] hash = sha.ComputeHash(passwordBytes); //invio nuovamente la richiesta di login WriteMessage(stream, Encoding.ASCII.GetBytes(TipoComando.REQUEST_LOGIN), 0, TipoComando.REQUEST_LOGIN.Length); WriteMessage(stream, hash, 0, hash.Length); //invio hash challengeMessage = new byte[1024]; ReadMessage(stream, challengeMessage, 0, 6); messageString = Encoding.ASCII.GetString(challengeMessage, 0, 6); } else { //termino il tentativo di login WriteMessage(stream, Encoding.ASCII.GetBytes(TipoComando.CLOSE_CONNECTION), 0, 6); //Scateno l'evento di richiesta login ServerEventArgs args = new ServerEventArgs() { Server = server, Position = -1 }; worker.ReportProgress(PASSWORD_REQUIRED, args); CloseServer(server); continue; } } if (!messageString.Equals(TipoComando.LOGIN_OK)) {//connessione non effettuata o messaggio di risposta non valido //chiudo connessioni aperte CloseServer(server); if (messageString.Equals(TipoComando.LOGIN_ERROR)){ ServerErrorEventsArgs args = new ServerErrorEventsArgs() { Server = server, Position = -1,ErrorCode = ServerErrorEventsArgs.PASSWORD_ERROR }; worker.ReportProgress(PASSWORD_ERROR, args); } continue; } //Ho ricevuto la conferma di login. //Leggo i paramentri di configurazione byte[] confByte = new byte[1024]; ReadMessage(stream, confByte, 0, 6); String conf = Encoding.ASCII.GetString(confByte, 0, 6); if (!conf.Equals(TipoComando.LOGIN_UDP_PORT)) { Trace.TraceWarning("Ricevuto un messaggio errato in connectServerWorker_DoWork(). Messaggio:{0}.", conf); //chiudo connessioni aperte ServerErrorEventsArgs args = new ServerErrorEventsArgs() { Server = server, Position = -1, ErrorCode = ServerErrorEventsArgs.LOGIN_ERROR }; EventHandler<ServerErrorEventsArgs> handler = ServerError; if (handler != null) { handler(this, args); } CloseServer(server); continue; } ParameterLogin(ref stream, ref server); serverToConnect.Enqueue(server); Trace.TraceInformation("Server connesso. Server: {0}:{1}:{2}", server.Name, server.IP, server.ControlPort); worker.ReportProgress(serverToConnect.Count); } catch (NetworkException) { Trace.TraceError("NetworkException in connectServerWorker_DoWork()."); //inizializzo l'evento da inviare ServerErrorEventsArgs args = new ServerErrorEventsArgs() { Server = server, Position = -1, ErrorCode = ServerErrorEventsArgs.NETWORK_ERROR }; worker.ReportProgress(ERROR, args); CloseServer(server); } catch (OperationCanceledException) { continue; } catch (Exception se) { if (se is SocketException || se is IOException) { //inizializzo l'evento da inviare ServerErrorEventsArgs args = new ServerErrorEventsArgs() { Server = server, Position = -1, ErrorCode = ServerErrorEventsArgs.CONNECTION_ERROR }; worker.ReportProgress(ERROR, args); CloseServer(server); } else { ServerErrorEventsArgs args = new ServerErrorEventsArgs() { Server = server, Position = -1, ErrorCode = ServerErrorEventsArgs.CONNECTION_ERROR }; worker.ReportProgress(ERROR, args); CloseServer(server); } Trace.TraceError("Exception in riceviInfoServerWorker_DoWork(). Stack trace:\n{0}.", se.StackTrace); } } }
internal void ImpossibleToDeactive(ServerConnection serverConnection) { ServerErrorEventsArgs args = null; args = new ServerErrorEventsArgs() { Server = serverConnection.Server, Position = serverConnessi.IndexOf(serverConnection), ErrorCode = ServerErrorEventsArgs.CLIPBOARD_IN_ACTION }; EventHandler<ServerErrorEventsArgs> handler = ServerError; if (handler != null) { handler(this, args); } }
internal void ClosedByServerError(ServerConnection serverConnection) { ServerErrorEventsArgs args = null; int position = -1; position = serverConnessi.IndexOf(serverConnection); //inizializzo l'evento da inviare args = new ServerErrorEventsArgs() { Server = serverConnection.Server, Position = position, ErrorCode = ServerErrorEventsArgs.SERVER_ERROR }; serverConnessi.Remove(serverConnection); if (serverConnessi.Count == 0) { started = false; serverAttivoIndex = -1; } EventHandler<ServerErrorEventsArgs> handler = ServerError; if (handler != null) { handler(this, args); } EventArgs argsRefresh = new EventArgs(); EventHandler<EventArgs> handlerRefresh = RefreshConnections; if (handlerRefresh != null) { handlerRefresh(this, argsRefresh); } if (serverAttivoIndex == position && started) { ServerConnection serverToActive = serverConnessi[0]; setActive(serverToActive); } else if (position < serverAttivoIndex) {//Perché nella lista potrebbe precederlo serverAttivoIndex--; } }
internal void ClosedByNetworkError(ServerConnection serverConnection) { serverConnessi.Remove(serverConnection); serverAttivoIndex = -1; ServerErrorEventsArgs args = null; //inizializzo l'evento da inviare args = new ServerErrorEventsArgs() { Server = serverConnection.Server, Position = serverConnessi.IndexOf(serverConnection), ErrorCode = ServerErrorEventsArgs.NETWORK_ERROR }; EventHandler<ServerErrorEventsArgs> handler = ServerError; if (handler != null) { handler(this, args); } while (serverConnessi.Count > 0) { serverConnessi[0].ForceToDisconnect(); serverConnessi.RemoveAt(0); } EventArgs argsRefresh = new EventArgs(); EventHandler<EventArgs> handlerRefresh = RefreshConnections; if (handlerRefresh != null) { handlerRefresh(this, argsRefresh); } }