PDA

Visualizza la versione completa : [C++] "Read" & "Write" su Buffer


^EvAmPiReS^
25-05-2006, 15:48
Ciao ho il seguente problema di programmazione di rete:

Client:


while(1)
{

if( (command = getservice()) != NULL) {

iwrite=0;
i=0;
lenght=30;

while( (i = write(sock_fd, &(command[iwrite]), lenght-iwrite)) > 0 ) {

iwrite += i;
}

if( (strncmp(command,"LIST", 4) == 0) ) {

i=0;

iread = 0;

while( (i = read(sock_fd, &(buff[iread]), lenght-iread)) > 0 ) {

iread += i;

printf("\nRead %d bytes\n",i);

printf("\niread= %d \n",iread);

}

printf("\nFinally %d bytes\n",iread);

for(f=0;f<lenght;f++) {

printf("\nbuff[%d] = %d\n",f,buff[f]);

}


}

}

}

/*Closing socket descriptor*/

close(sock_fd);

}



Server:


if((strncmp(buff,"LIST",4))==0){

printf("\nLIST function:\n");

n = stringcounter(buff);

iwrite = 0;

i = 0;

string_len = 30;

if(n>0) {

sprintf(buff,"%d",n); /*scrivo il numero di stringhe dentro buff*/

while((iwrite<string_len)&&(i=write(newsock_fd,&(buff[iwrite]),string_len-iwrite)) >0 ) {

if(i<0) {

perror("Writing error\n\n");

close(newsock_fd);

break;
}

iwrite+=i;

printf("\nWrited %d bytes\n",i);

} /*finisce il while*/

printf("\nWriting accomplished\n");
}


if(n<=0) {

printf("\nNon ci sono stringhe nel file di testo!\n");

}

close(newsock_fd);

}


Il client effettua una write della stringa comando, il server lo legge e si comporta di conseguenza:
Se il comando "LIST" allora deve effettuare una write del numero di stringhe contenute in un file di testo.
Quando vado a stampare il buffer che ha ricevuto il client, succede una cosa strana ovvero, i dati che vengono ricevuti attraverso la socket vengono scritti a partire dalla terza cella dell'array(buffer[2]), a volte stampo anche rimasugli di comandi precedenti, byte rimasti da precedenti operazioni, ma ci non toglie che il numero che metto nella stringa tramite la sprintf viene memorizzato comunque dalla terza cella in poi. Ho provato con fflush(stdin) ma il problema persisteva allora leggendo vecchi thread ho visto la funzione memset ed ho provato:


memset((void*)&buff,0,sizeof(buff));


ma ricevo "segmentation fault", sia in questo modo che con "buff" al posto di "&buff".
Idee? Grazie. :dh:

^EvAmPiReS^
25-05-2006, 18:57
UP :nonlodire

ibykos
26-05-2006, 08:13
prova con questo codice:



#define MAXBUF 1024 /*nei computer attuali sarebbe meglio 8*1024 */

...

char buffer [MAXBUF];

...

while (...) {
memset (buffer,0,MAXBUF);
uso il buffer a partire dalla prima cella
}

^EvAmPiReS^
26-05-2006, 16:44
Ok, credo che il mio problema si sia ridotto al fatto che non riesca a pulire lo stdin lato client dopo l'invio del comando per il server e prima della lettura del numero di stringhe. Ho fatto una ricerca su questo forum ed ho trovato come soluzioni possibili:

1 - fflush(stdin); --> :dh:

2 - fflush(0); ---> :dh:

3 - #define fflush(stdin) while ((getchar()) != '\n') ---> non fa per me vorrei evitare che
l'utente debba ogni volta premere invio e poi insomma spero ci sia una soluzione "migliore"

Inoltre ho provato con qualcosa tipo:

while( (ch=getc(stdin) && (ch!=EOF));

ma anche in questo caso, il programma si blocca sul while e sembra non trovare il flag EOF :cry:

Commo faccio?

:ciauz:

P.S. Non fraintendete il punto 3, a me andrebbe benissimo ma sto programma deve essere il pi generico possibile visto che sia il client che il server devono funzionare "incrociatamente" :) con client e server del mio prof. :bh:

Loading