Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        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);
                }

            }
        }
Exemplo n.º 4
0
 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);
     }
 }
Exemplo n.º 5
0
 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--;
     }
 }
Exemplo n.º 6
0
        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);
            }
        }