Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    64

    [C/C++] problemi lettura da socket stream

    Ciao a tutti,

    sto realizzando un programma client server che invia e legge dei dati di vario tipo.
    Mi sono accorto che quando invio al termine di una serie di altri dati una stringa che è relativa ad un path di un file alla fine di questa quando viene letta dal server vengono aggiunti dei caratteri che non centrano niente (!£$%& ecc...due o tre dipende) e che ovviamente fanno poi fallire l'elaborazione di quello che voglio fare...

    La parte critica è la seguente....lato client....

    codice:
    		cout << "PATH: ";
    		cin >> path;
    		l_dato = (uint32_t) path.length();
    		cout << "Data length: " << l_dato << endl;
    		cout << path << endl;	
    		n = write(sockfd,&l_dato,4); if (n < 0) error("ERROR8");
    		n = write(sockfd,path.c_str(),path.length()); if (n < 0) error("ERROR9");
    e lato server...

    codice:
    		n = read(newsockfd,&add.data_length,4);
    		if (n < 0) error("ERROR reading from socket--add-data_length");		
                    add_mess->data_length = add.data_length;
    ...
    
    add_mess->dato = (char* )malloc(((unsigned long int)add_mess->data_length)*sizeof(char));		
    				
    		for (k=0;k<=add_mess->data_length; k=k+n){
    			n = read(newsockfd,&add_mess->dato[k],(unsigned long int)add_mess->data_length - k);	
    			//printf("k---> %d--->%d\n",k,n);		
    			if (n < 0) error("ERROR reading from socket--add");
    			if (n==0) break;
    		}
    
    printf("Mess:%s\n",add_mess->dato);
    nel server faccio un ciclo per passare delle volte un intero file quindi uso più read...ma il problema persiste anche con una singola lettura....senza ciclo intendo...


    sembra quasi che si sporchi il buffer di lettura perchè il valore che gli passo relativoa quanto deve leggere da stream è corretto...

    qualcuno mi pùò illuminare....

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Ho spostato la discussione nell'area più indicata.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Fai un errore concettuale confondendo le C string con array di char.
    La printf() stampa il contenuto di add_mess->dato fino a quando trova un terminatore NULL che può trovarsi oltre il numero di caratteri letti.
    In teoria puoi risolvere ponendo dopo il ciclo for
    codice:
    add_mess->dato[k]=0;
    ma se devi trasferire in binario ti crea dei problemi.

    Inoltre il ciclo for è sbagliato.
    Non dev'essere:
    codice:
    for (k=0;k<=add_mess->data_length; k=k+n)
    ma
    codice:
    for (k=0;k<add_mess->data_length; k=k+n)
    In più mischiare C e C++ è sbagliato.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2005
    Messaggi
    64
    Ho provato ad aggiungere il terminatore alla fine, ma il problema persiste....

    ho modificato anche il ciclo come mi hai consigliato...

    ma mi sembra quasi che la read vada a leggere qualcosa in più o forse alloco male la variabile...

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ho detto in teoria, non ho detto che dev'essere così.
    la read restituisce il numero di caratteri letti per ogni singola lettura e non è detto che alla fine la sommatoria dei vari n sia == k.
    Devi aggiungere un'altra variabile.
    codice:
    int idx=0;
    for (k=0;k< add_mess->data_length; k=k+n){
    			n = read(newsockfd,&add_mess->dato[k],(unsigned long int)add_mess->data_length - k);
                            idx+=n;	
    			//printf("k---> %d--->%d\n",k,n);		
    			if (n < 0) error("ERROR reading from socket--add");
    			if (n==0) break;
    		}
                    add_mess->dato[idx]=0;
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.