Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93

    [C#]client-server argumentoutofrangeexception

    ciao ragazzi ricevo una eccezione su codice all'apparenza perfetto.sto cercando di implementare una chat, con gestione multithread dei client.
    questo è il while del server in cui vengono accettate le connessioni in ingresso.nel momento in cui un client si connette, la connessione avviene ma ricevo la suddetta eccezione sulla riga networkStream.Read(bytesFrom, 0, (int)client.ReceiveBufferSize); in particolare sul terzo parametro della funzione.allego sotto il codice del client che al momento della connessione manda il nick con una $ concatenata.
    ho provato anche a modificare il terzo parametro e a mettere un numero elevato di byte da leggere come 4096.l'eccezione nn viene sollevata li ma si sposta tre righe più sotto...
    dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
    dicendo che lenght non può essere minore di 0.

    codice:
    while (true)
                {
                    //blocks until a client has connected to the server
                    System.Diagnostics.Debug.WriteLine("server in ascolto");
                    TcpClient client = this.tcpListener.AcceptTcpClient();
    
                    //create a thread to handle communication
                    //with connected client
                    System.Diagnostics.Debug.WriteLine("client connesso!!");
                    //agiungo alla hash poi avvio thread
                    byte[] bytesFrom = new byte[10025];
                    string dataFromClient = null;
                    
                    NetworkStream networkStream = client.GetStream();
                    networkStream.Read(bytesFrom, 0, (int)client.ReceiveBufferSize);
                    dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                    dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
    
                    clientsList.Add(dataFromClient, client);
                    broadcast(dataFromClient + " Joined ", dataFromClient, false);
      
                    Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                    clientThread.Start(new object[] { client, dataFromClient});
                }
    CLIENT

    codice:
    {
                client = new TcpClient();
    
                IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);
    
                client.Connect(serverEndPoint);
                NetworkStream serverStream = client.GetStream();
                ASCIIEncoding encoder = new ASCIIEncoding();
                byte[] buffer = encoder.GetBytes(this.textBox1.Text);
                serverStream.Write(buffer, 0, buffer.Length);
                serverStream.Flush();
    
                
                
            }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Hai controllato quanto vale

    client.ReceiveBufferSize

    quando hai l'errore?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    ..rca paletta vale 128000
    effettivamente portando il buffer ad un valore maggiore risolvo l'errore.
    ma stilisticamente è corretto fare array cosi grandi?il valore resta sempre 128000?in base a cosa viene stabilito?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il valore di default dovrebbe essere 8192

    Sei sicuro che non venga impostato ad un valore diverso in qualche altra parte del codice?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    l'unica impostazione di dimensione che faccio è questo nel momento dell'invio dal client
    byte[] buffer = encoder.GetBytes(this.textBox1.Text);
    a prescindere dai caratteri che inserisco resta sempre 128000...

    già che ci sono ti chiedo una cosa sulla hash che ho creato nick-socket.quando gestisco il client dal server, vorrei accedere al nick (chiave) dal socket (valore).come faccio?
    questa istruzione mi restituisce una stringa vuota...

    (string)clientsList[Client];

    dove clientlist è la hash e Client l'oggetto di tipo TcpClient.devo andare di foreach?
    spero di essermi spiegato
    grazie mille!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da ratal
    spero di essermi spiegato
    No
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    93
    se io ho una hashtable clientList fatta da coppie di tipo string-tcpclient come faccio a risalire alla stringa corrispondente da un determinato tcpclient?
    per ottenere un dato tcpclient avendo la stringa basta fare (tcpclient)clientsList[miastringa]; ma per fare il processo inverso?
    (string)clientsList[Client]; restituisce un valore vuoto...

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non puoi, dato che la chiave è la lista. A meno che non esplori tutta la collection ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.