1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
//J'envoie la requete avec sa taille en octets
Send(requete, taille requete);
//Je recupère tout d'abord 1024 octets de la socket
//1024 est choisi arbitrairement, mais suffisamment grand pour avoir le header http en entier
Receive(dataRcv, 1024)
//Recherche une occurence de "Content-Length: "
uint8_t* content = (uint8_t *) strstr((char*) dataRcv, "Content-Length: ");
//Recherche de la fin du header http
uint8_t* endHeader = (uint8_t *) strstr((char*) content , "\r\n\r\n");
*endHeader = 0x00;
//Recupere la valeur de "Content-Length: ", cad la taille de l'image, dans imageSize
sizeLength = STRLEN(content +16);
length = (uint8_t *) MALLOC( sizeof(uint8_t) * sizeLength + 1 );
memcpy(length, content+16, sizeLength);
length[sizeLength] = 0;
imageSize = atoi((char*) length);
free(length);
//Allocation memoire pour le buffer qui va contenir l'image
uint8_t* downloadedImage = (uint8_t*) malloc( imageSize );
//On Recupere la taille du header
sizeHeader = STRLEN(dataRcv) + 4;
//Je copie la premiere partie de l'image, recuperée avec le header http, dans le buffer
memcpy(downloadedImage, endHeader+4, 1024 - sizeHeader);
//On definit la nouvelle taille (en octects tjs) à recevoir
sizeDataRcv = imageSize - (PACKET_SIZE - sizeHeader);
free(dataRcv);
//On récupère la dernière partie de la réponse http qui correspond à la dernière partie de l'image
Receive(dataRcv,sizeDataRcv );
//Je copie la dernière partie dans le buffer
memcpy(downloadedImage+(1024-sizeHeader), dataRcv, sizeDataRcv);
free(dataRcv);
//Enfin je copie l'image sur le disque pour vérifier si l'image a été récuperée correctement ou non
FILE * bulk;
if ( ( bulk = fopen("image.jpg", "wb") ) == NULL )
cout << "Can't open file to write image.jpg" << endl;
else
{
fwrite(downloadedImage, 1 , imageSize , bulk);
fclose(bulk);
} |
Partager