PDA

View Full Version : [C++] socket recv()


jk-koldus
28-05-2007, 14:44
stavo realizzando uno script in c++ che prende una pagina da web dopo essersi connesso... presupponendo che abbia ben fatto la prima parte del programma (almeno credo) mi chiedevo come posso immagazzinare tutto il codice-risposta che mi manda il server web...

mi spiego meglio...

bytes_receved = recv(sockfd, buff, sizeof(buff)-1,0);
printf("%s",buff);

questa parte di codice mi stampa semplicemente la prima parte di quello che mi dovrebbe mandare (o forse mi manda) il server...
ah dimenticavo la variabile buff è dichiarata:

char buff[4000]={0};

qualcuno sa dirmi come faccio a ottenere tutto il codice?

jk-koldus
28-05-2007, 14:57
aggiorno..

ho modificato il codice con:

do {
char buff[512]={0};
bytes_receved = recv(sockfd, buff, sizeof(buff)-1,0);
printf("%s",buff);
} while (buff);

mi stampa tutto il codice ma non esce dal ciclo... cosa ho sbagliato?

tglman
28-05-2007, 15:09
1) Non credo che cosi funzioni buff è fuori dallo scope.
2) se la variabile buff è inizializata a {0} buff vale l'indirizzo di {0} e buff[0] == 0.

tomminno
28-05-2007, 15:30
aggiorno..

ho modificato il codice con:

do {
char buff[512]={0};
bytes_receved = recv(sockfd, buff, sizeof(buff)-1,0);
printf("%s",buff);
} while (buff);

mi stampa tutto il codice ma non esce dal ciclo... cosa ho sbagliato?

Visto che il tuo programma si connette ad un server HTTP ti serve conoscere il protocollo HTTP.
Non ho mai capito bene come si determina la fine della risposta, infatti l'header finisce con una sequenza \r\n\r\n (corrispondente al fine linea dell'ultima riga dell'header e un a capo per separare l'header dal contenuto), il corpo della pagina finisce con un solo \r\n.

tglman
28-05-2007, 15:56
Per quelllo che so io devi vedere nell'header per sapere quando finira la risposta, più precisamente "content-size:10" dove 10 sono il numero di byte dopo il doppio "\r\n"

Fede_Reghe
28-05-2007, 16:01
Ma quando la risposta finisce il recv() resistuisce -1!!!

jk-koldus
28-05-2007, 18:10
"content-size:10" <--- questo non me lo manda nell'header...


Ma quando la risposta finisce il recv() resistuisce -1!!! <--- ho fatto un print dei recv e non da -1 ma mi restituisce 0...

io ho risolto facendo:

FILE *fp;
fp = fopen("file.txt", "w");

while(buff) {
char buff[512] = {0};
bytes_receved = recv(sockfd, buff, sizeof(buff)-1,0);
if(strlen(buff) < 1) { break; }
fwrite(buff, 1, strlen(buff), fp);
}

fclose(fp);


dite che mi può dare qualche errore? può non terminarmi il programma?

jk-koldus
28-05-2007, 18:11
avendo creato questo file posso riuscire a lavorare come se fosse un'unica variabile usando le regex?