Bonjour à tous !
Voila, j'ai un souci avec l'envoi d'un buffer de données par socket tcp/ip.
J'ai une caméra (cliente) qui prend des images pgm, les converties en jpeg et les envois au serveur (pc). Mais le buffer reçu est différent de celui envoyé !
code du client (caméra) qui envoit l'image :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //sauvegarde de l'image dans un fichier FreeImage_Save(FIF_JPEG, check, "imageprise.jpg", JPEG_DEFAULT); // encode and save the image to the memory FreeImage_SaveToMemory( FIF_JPEG, check, hmemjpeg, JPEG_DEFAULT ); int jpeg_size = (int) FreeImage_TellMemory(hmemjpeg); std::cout << "taille du jpeg : " << jpeg_size << std::endl; // // Envoit du buffer : // p->sendInteger( jpeg_size, sizeof(int) ); p->send( (const char*) hmemjpeg, jpeg_size );
code du serveur qui reçoit l'image :
Voila, l'envoit se passe bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #define CENT_KILO 102400 unsigned char *reception = new unsigned char[CENT_KILO]; cout << "Allocation mémoire : ok " << endl; .... //attente de données pendant 5 secondes p->waitData(5) ; //reception de la taille du fichier jpeg : p->receiveInteger( intsize, &jpegfilesize, &recu); //reception du fichier : p->receive(jpegfilesize, reception , &sz); cout << "Image n°"<< i <<" Taille reçue : "<< sz <<" Taille attendue : "<< jpegfilesize << endl; // écriture dans un fichier : FILE *stream = fopen("buffer.jpg", "wb"); if(stream) { fwrite( reception, sizeof(BYTE), jpegfilesize, stream); fclose(stream); } .... delete[] reception;
Client:
Serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part taille du jpeg : 68859
Code : Sélectionner tout - Visualiser dans une fenêtre à part Image n°0 Taille reçue : 68859 Taille attendue : 68859
Mais les données reçues sont différentes :
données envoyées par la caméra (fichier imageprise.jpeg)
buffer reçu par le pc (fichier buffer.jpeg)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 00000000: ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 ......JFIF.....H 00000010: 00 48 00 00 ff db 00 43 00 08 06 06 07 06 05 08 .H.....C........ 00000020: 07 07 07 09 09 08 0a 0c 14 0d 0c 0b 0b 0c 19 12 ................ 00000030: 13 0f 14 1d 1a 1f 1e 1d 1a 1c 1c 20 24 2e 27 20 ........... $.' 00000040: 22 2c 23 1c 1c 28 37 29 2c 30 31 34 34 34 1f 27 ",#..(7),01444.' 00000050: 39 3d 38 32 3c 2e 33 34 32 ff c0 00 0b 08 04 0e 9=82<.342....... 00000060: 05 6c 01 01 11 00 ff c4 00 1f 00 00 01 05 01 01 .l.............. 00000070: 01 01 01 01 00 00 00 00 00 00 00 00 01 02 03 04 ................ 00000080: 05 06 07 08 09 0a 0b ff c4 00 b5 10 00 02 01 03 ................ 00000090: 03 02 04 03 05 05 04 04 00 00 01 7d 01 02 03 00 ...........}....
Voila, c'est la première fois que je fais des socket en C++ et je ne comprend pas ce qu'il se passe !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 00000000: 10 05 d0 00 10 04 dd 70 00 00 00 10 00 00 00 19 .......p........ 00000010: 00 00 00 00 10 05 bd 28 00 00 00 00 00 00 00 00 .......(........ 00000020: 2a af 29 28 00 00 00 19 00 00 00 01 10 05 8e 68 *.)(...........h 00000030: 10 04 d4 18 10 05 bd 28 2a af 28 78 00 00 00 19 .......(*.(x.... 00000040: 00 00 00 01 2a af 55 38 10 04 f9 40 10 04 ef 50 ....*.U8...@...P 00000050: 2a ae 76 00 00 00 00 19 00 00 00 01 10 05 63 78 *.v...........cx 00000060: 10 05 6f 90 10 05 63 a8 2a ae 6e 60 00 00 00 19 ..o...c.*.n`.... 00000070: 00 00 00 00 10 04 d5 20 00 00 00 00 00 00 00 00 ....... ........ 00000080: 2a ad 10 40 00 00 00 19 00 00 00 00 10 04 d5 e0 *..@............ 00000090: 00 00 00 00 00 00 00 00 2a af 29 28 00 00 00 19 ........*.)(.... 000000a0: 00 00 00 01 2a ae fc 00 10 04 d5 20 10 04 d5 e0 ....*...... ....
fonction d'envois :
et de reception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 void ProtocoleTCP::send(const char *data, const unsigned int size) throw (CSocketError){ if (connecte){ /*La fonction boucle pour envoyer le nombre d'octets demandés */ int nb=0; for (unsigned int i=0; i<size; i+=nb){ /*envois des données*/ #ifdef CLIENT //client envoit au serveur nb= ::send(sock, data+i, size, 0); #else //serveur envoit au client nb= ::send(csock, data+i, size, 0); #endif if (nb == SOCKET_ERROR) throw CSocketError("Impossible d'envoyer les données sur la socket !"); } } else std::cout << "La connexion n'est pas établie !" << std::endl; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 void ProtocoleTCP::receive(const unsigned int size, unsigned char* buf, size_t *buf_size) throw (CSocketError) { if (connecte){ #define MAX_OCTETS 10240 int nb; std::string msg; for(size_t i=0; i < size ; i+= nb) { char* recpt=new char[MAX_OCTETS]; // On reçoit les données par paquets maximum de MAX_OCTETS #ifdef CLIENT //client recoit du serveur nb=recv(sock, recpt, (size_t) ( (size-i-1)%MAX_OCTETS+1 ), 0); #else //serveur recoit du client nb=recv(csock, recpt, (size_t) ( (size-i-1)%MAX_OCTETS+1 ), 0); #endif //std::cout << "Recut "<<nb<<" octets!" << std::endl; recpt[nb]='\0'; //std::cout << "Recpt : " << std::string(recpt) << std::endl; // Si on a rien reçut, on arrete if(nb == 0) { *buf_size=0; std::cout << "Pas de données à lire!" << std::endl; return; } // Vérification d'erreur if(nb < 0) throw CSocketError("Erreur lors de la réception sur la socket !"); // Concaténation du paquet reçut avec le reste du message. msg += std::string(recpt, nb); delete[] recpt; } *buf_size=msg.size(); memcpy( (char *)buf, msg.c_str(), *buf_size); } else std::cout << "La connexion n'est pas établie !" << std::endl; }
Merci pour votre aide !
Partager