Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - metodo write(byte,int,int)
Forum - C# / VB.NET - metodo write(byte,int,int)

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 15:38
Martedì, 26/02/2008
ciao, ho scaricato la chat fatta da vinc94 e ci ho inserito la possibilità di inviare file, il programma funziona senza bug, solo che durante l'invio consuma tantissima CPU, scrivo il sorgente



Codice sorgente - presumibilmente C# / VB.NET

  1. try
  2.                 {
  3.                     clientdifile.Connect(textBoxHost.Text, 1919);
  4.                     streamdifile = clientdifile.GetStream();
  5.  
  6.                     clientconferma.Connect(textBoxHost.Text, 1920);
  7.                     streamconferma = clientconferma.GetStream();
  8.  
  9.  
  10.                     writerconferma = new StreamWriter(streamconferma);
  11.                     readerconferma = new StreamReader(streamconferma);
  12.  
  13.  
  14.                     FileStream flusso = new FileStream(aprifinestrainvio.FileName, FileMode.Open);
  15.  
  16.                     byte dati;
  17.                     UInt64 cont = 0;
  18.                     string istruzioni;
  19.                     int k;
  20.                     int blocchi = 0;
  21.                     UInt64 resto = Convert.ToUInt64(flusso.Length) % 100000;
  22.                     UInt64 cicli = ((Convert.ToUInt64(flusso.Length) - resto)) / 100000;
  23.  
  24.                     writerconferma.WriteLine(flusso.Length);
  25.                     writerconferma.Flush();
  26.  
  27.                     for (cont=0; cont < cicli+1; cont++)
  28.                     {
  29.                         if (cont != cicli - 1)
  30.                         {
  31.                             blocchi = 100000;
  32.                         }
  33.                         else
  34.                         {
  35.                             blocchi = Convert.ToInt32(resto);
  36.                         }
  37.                        
  38.                         istruzioni = readerconferma.ReadLine();
  39.  
  40.                         if (istruzioni == "okvai")
  41.                         {
  42.                             for (k = 0; k < blocchi; k++)
  43.                             {
  44.                              //   dati = Convert.ToByte(flusso.ReadByte());
  45.                                 streamdifile.WriteByte(Convert.ToByte(flusso.ReadByte()));
  46.                             }
  47.  
  48.                         }
  49.                     }
  50.  
  51.  
  52.  
  53.                     streamdifile.Flush();
  54.                     streamdifile.Close();
  55.                     flusso.Flush();
  56.                     flusso.Close();
  57.  
  58.                 }
  59.  
  60.                 catch
  61.                 {
  62.                     MessageBox.Show("eccezzione nell'invio del file");
  63.                     MessageBox.Show(Convert.ToString(e));
  64.                 }
  65.             }







credo che il problema sia nel lunghissimo ciclo for che il programma deve fare per leggere byte pr byte il file e metterlo nel flusso della rete.
ho visto che c'è volendo nel framework il metodo write (byte,int,int) solo che ho dei vari problemi ad usarlo quando voglio leggere un bloco di byte non nell'inizio del file, ma ad esempio a metà file.

chi mi può aiutare?

grazie! :-?

Ultima modifica effettuata da Il Totem il 26/02/2008 alle 16:12
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:16
Martedì, 26/02/2008
Oltre al fatto che non chiudi readerconferma e writerconferma. Comunque l'uso di WriteBytes è questo:
Write(Array, Integer, Integer)
- Array : l'array di bytes da scrivere sul file.
- Integer :  l'offset da cui partire. 0 indica la posizione iniziale, 1 la seconda, 2 la terza e così via. Se vuoi partire da metà Indicherai (Size/2-1), dove Size è la lunghezza del file.
- Integer : il numero di bytes da scrivere; di solito scrivi tutto l'array, quindi questo numero dovrebbe essere pari o al più inferiore alla lunghezza dell'array.

Ultima modifica effettuata da Il Totem il 26/02/2008 alle 16:16
PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 17:10
Martedì, 26/02/2008
mi riferivo al metodo read(array,int,int) che comunque è uguale solo che opposto; mi serve leggere dal file solo alcune porzioni perchè non posso caricare in memoria un file intero (pensa se fosse da 2 GB), comunque ero andato nel visualizzatore di oggetti per vedermi cosa significano i parametri, l'unica cosa che non avevo ben capito era cos'è l'offset (sono andato su wikipedia ma non ho molto capito), quindi offset=0 significa il primo byte, offset=50 il 50esimo byte; il secondo parametro invece è la quantità di byte da leggere (50,100)=parti dal 50esimo byte e leggi fino al 150esimo (o 149esimo? boh!).

ho detto giusto?

grazie! :)

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 20:20
Giovedì, 28/02/2008
No, hai fatto un po' di confusione. La differenza è questa:

L'offset è un indice, ossia un numero in base 0. Con ciò significa che inizi a contare da 0 e non da 1. Quindi il primo byte avrà offset 0, il secondo 1, il cinquantesimo 49. Per ottenere l'offset dell'n-esimo byte, calcoli (n-1).

Length è una lunghezza, ossia un numero in base 1. Con ciò significa che inizi a contare da 1 qualora ovviamente la lunghezza non sia nulla ma in quel caso non servirebbe a niente (leggere 0 byte?). Quindi se devi leggere 3 bytes, avrai una Length di 3.

Per leggere 50 byte a partire dal ventesimo:
Codice sorgente - presumibilmente Plain Text

  1. Stream.Read(Array, 19, 50)


PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 18:01
Venerdì, 29/02/2008
sono riuscito a risolvere il problema, però non è come sembra,

flusso.Read(dati,0, blocchi);                                streamdifile.Write(dati,0,blocchi);
streamdifile.Flush();

blocchi è una variabile che ha sempre lo stesso valore e così funziona perfettamente anche se faccio fatica a capire perchè l'offset debba sempre valero 0, forse perchè significa "parti dal byte posizione zero rispetto all'indice di lettura (che quindi non vale sempre 0 ma aumenta ogni volta)"?
vi assicuro che funziona

invece ho un'altr problema che non centra niente con questo, succede che quando chiudo la mia applicazione server, si chiuda il form ma rimanga il processo, cosa può essere secondo voi?

grazie

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:07
Sabato, 01/03/2008
Testo quotato

Postato originariamente da punkettone90:

sono riuscito a risolvere il problema, però non è come sembra,

flusso.Read(dati,0, blocchi);                                streamdifile.Write(dati,0,blocchi);
streamdifile.Flush();

blocchi è una variabile che ha sempre lo stesso valore e così funziona perfettamente anche se faccio fatica a capire perchè l'offset debba sempre valero 0, forse perchè significa "parti dal byte posizione zero rispetto all'indice di lettura (che quindi non vale sempre 0 ma aumenta ogni volta)"?
vi assicuro che funziona

invece ho un'altr problema che non centra niente con questo, succede che quando chiudo la mia applicazione server, si chiuda il form ma rimanga il processo, cosa può essere secondo voi?

grazie



Quel codice legge e scrive blocchi bytes a partire dal primo. L'offset è assoluto, non relativo: 0 è il primo byte del file.

Forse hai lasciato attivo il tcpclient, il socket o il listener...?

PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 18:13
Sabato, 01/03/2008
strano, eppure funziona... presto pubblicherò il programma, ho però un ultimo problema, il metodo che riceve i file è composto di istruzione try{} e questo metodo viene avviato come un processo (thread nomeprocesso=new thread(nomemetodo); nomeprocesso.start();) era proprio quello che non permette di chiudere completamente l'applicazione (credo), se anche secondo voi è proprio quel processo che non permette la chiusura, cosa posso fare per terminarlo? so che c'è il comando nomeprocesso.stop(); ma non riesco a chiamarlo al di fuori del metodo in cui è stato dichiarato il processo stesso

grazie!

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:13
Domenica, 02/03/2008
Il fatto che il thread soppravviva alla chiusura dell'applicazione fa pensare che all'interno della sua procedura ci sia un ciclo o qualcosa del genere che non termini. Potrebbe essere utile usare un If per controllare lo stato e poi richiamare Stop. Oppure posta il codice e vediamo.

PM Quote
Avatar
punkettone90 (Member)
Expert


Messaggi: 279
Iscritto: 16/05/2007

Segnala al moderatore
Postato alle 12:54
Domenica, 02/03/2008
        public void connettionfile()
        {
            try
            {

                listenerdifile = new TcpListener(1919);
                listenerdifile.Start();
                listeneristruzioni = new TcpListener(1920);
                listeneristruzioni.Start();
                
                clientdifile = listenerdifile.AcceptTcpClient();
                streamdifile = clientdifile.GetStream();


credo che qui si ferma il metodo, aspetta finchè quacuno non viene; come posso risolvere questo problema?

grazie! :)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo