Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577

    [c++] Problema con le socket

    il codice sotto riportato, preso in parte prestito dalla rete, codificato per Borland Builder C++, ha lo scopo catturare tutto il testo proveniente da socket da un client ed infine, una volta ottenuto completamente il testo, richiamare MiaFunzione().

    Dato che il testo trasmesso dal cilent verso il server non viene ricevuto completo in una singola trasmissione, ho pensato di usare un secondo buffer che viene eliminato solo dopo aver richiamato MiaFunzione().
    Per il secondo buffer2 ho provato, come suggeritomi da un utente in questo forum, ad utilizzare una String buffer2; in quanto mi libera da funzioni tipo realloc() et similia, ma ho il problema della sua distruzione una volta usato tale buffer2 o almeno, io non ho ancora scoperto come distruggere tale oggetto in modo da averne uno nuovo quando devo ricevere un nuovo testo.
    Purtroppp pecco di inesperienza e magari vi sono metodi molto più puliti e raffinati, quindi chiedo a voi consigli.

    grazie

    codice:
    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
          TCustomWinSocket *Socket)
    {
      char *buffer;
      String buffer2;
      int  Size;
      int ByteRecived;
    
      Size = Socket->ReceiveLength();
      buffer = new char[buffer_len];
      ByteRecived=Socket->ReceiveBuf(buffer, buffer_len);
    
    
    // inizio a costruire il mio buffer
      if(Size > 0)
       {
          buffer2+=buffer;
       }
    
       if( strstr(buffer2.c_str(), "FINETESTO") ) 
       {
    	MiaFunzione();
            delete[] buffer;
       }
    
    
    }

  2. #2

    Re: [c++] Problema con le socket

    Originariamente inviato da misterx
    ma ho il problema della sua distruzione una volta usato tale buffer2 o almeno, io non ho ancora scoperto come distruggere tale oggetto in modo da averne uno nuovo quando devo ricevere un nuovo testo.
    Non devi distruggere l'oggetto String. Quando devi ricevere il nuovo testo, se il testo che hai ricevuto finora non ti serve più lo cancelli (eventualmente dopo averlo analizzato), altrimenti continui ad accodare.

    Originariamente inviato da misterx
    codice:
      ByteRecived=Socket->ReceiveBuf(buffer, buffer_len);
    
       if( strstr(buffer2.c_str(), "FINETESTO") )
    Se il buffer temporaneo ti serve solo per accodare i byte ricevuti puoi farne a meno. Inoltre, per fare la ricerca, non passare per c_str(), usa il metodo Pos.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    forse mi sonon espresso in modo poco chiaro: quando mi arriva il testo io continuo ad accodare sino a quando non mi arriva "FINETESTO".

    Facendo n prove, mi sono accorto che analizzando la lunghezza di buffer2 richiamando buffer2.Length(); questa continua a crescere.

    Spiego:
    - mi arriva il testo
    - continuo ad accodare
    - arriva "FINETESTO"
    - termino di accodare e richiamo la mia funzione
    - visualizzo la lunghezza di buffer2 è ad esempio 1000
    - visualizzo il contenuto di buffer2 in un Memo ed ho una situazione

    renvio il medesimo testo senza uscire dal mio programma:
    - mi arriva il testo
    - continuo ad accodare
    - arriva "FINETESTO"
    - termino di accodare e richiamo la mia funzione
    - visualizzo la lunghezza di buffer2 è ad esempio 2000
    - visualizzo il contenuto di buffer2 in un Memo ed ho un testo incompleto

    la lunghezza di buffer2 aumenta ogni volta. Osservando il consumo di memoria nel taskmanager questo si incrementa ad ogni ricezione dello stesso testo, idem per la lunghezza di buffer2 che ogni volta aumenta di 1000.

    Mi aspettavo che ad ogni ricezione del testo buffer2 si azzerasse ed invece così non è.

    Ho sperimentato la buffer2.Delete(1,buffer2.Length()); ma ottengo il medesimo risultato.

    domande:
    1) come cancello quello che ho ottenuto sino ad ora come del resto anche tu suggerisci?
    2) è indifferente dichiarare localmente o globalmente buffer2?

    grazie 1000

  4. #4
    Originariamente inviato da misterx 1) come cancello quello che ho ottenuto sino ad ora come del resto anche tu suggerisci?
    Buffer2 = "";

    Originariamente inviato da misterx 2) è indifferente dichiarare localmente o globalmente buffer2?
    Ovviamente no. Esattamente come non lo è per tutte le altre variabili.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    grazie per ora

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    non mi è chiaro come mai dopo una chiamata del tipo Buffer2=""; ad ogni riutilizzo il suo contenuto è sporco, difatti dopo aver popolato Buffer2 accodando testo, ogni volta ho: o il testo intero oppure il testo troncato

    grazie


    p.s.
    sembrerebbe che il problema si manifesti quando ottengo molti pacchetti di piccole dimensioni

  7. #7
    Originariamente inviato da misterx
    non mi è chiaro come mai dopo una chiamata del tipo Buffer2=""; ad ogni riutilizzo il suo contenuto è sporco, difatti dopo aver popolato Buffer2 accodando testo, ogni volta ho: o il testo intero oppure il testo troncato
    Premesso che stiamo ipotizzando di lavorare con una connessione alla volta, a questo punto spiega bene come deve funzionare tutto il dialogo client/server altrimenti aiutarti è impossibile.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    Ho un applicativo client che si connette al server attraverso la porta 4000 ed invia un file di testo in formato ASCII presente su disco.

    Il server, sempre in ascolto sulla porta 4000, riceve il testo e riempie via via il Buffer2; nel momento in cui arriva il messaggio presente in coda al testo "FINETESTO", Buffer2 viene inviato ad un programma.


    Il problema è che inviando n volte il medesimo file di testo che è di lunghezza banale, 1300 caratteri, ha comportamenti sempre diversi lato server.

    Ho provato ad inserire alcuni Sleep(500); dove mi sembrava che il programma lato server necessitasse di una qualche pausa ma non è servito a nulla.

    Morale: a volte ottengo il testo per intero ed a volte solo alcuni caratteri, come se Buffer2 non venisse pulito di volta in volta.


    Momentaneamente la connessione attiva è una soltanto.

  9. #9
    Originariamente inviato da misterx
    Il problema è che inviando n volte il medesimo file di testo che è di lunghezza banale, 1300 caratteri, ha comportamenti sempre diversi lato server.
    Che significa comportamenti diversi? Quali? Prima parlavi di buffer sporco. Cioè? Dove è sporco? Con che caratteri?

    La parte client si può vedere?

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    è piuttosto semplice

    codice:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
            FILE *fp;
            char mybuf[256];
    
                    fp = fopen("test.txt","r");
    
                    if( ClientSocket1->Active )
                            ClientSocket1->Socket->SendText("INIZIOTESTO,");
    
                    while ( fgets(mybuf,sizeof(mybuf),fp) != NULL)
                    {
                            if( ClientSocket1->Active )
                                    ClientSocket1->Socket->SendBuf(mybuf,strlen(mybuf));
                    }
                    fclose(fp);
    
                    if( ClientSocket1->Active )
                            ClientSocket1->Socket->SendText(",FINETESTO;");
    
    
                    ClientSocket1->Close();
    }

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.