rassembler toutes les données à un seul endroit en mémoire en les copiant dans un buffer temporaire et faire un seul appel à send.
c'est ce que j'essaye de faire depuis le début et je pense que c'est ma façon de penser qui est mauvaise sur le coup.
1.Tout d'abord je crée ma structure (c'est un tableau de pointeur) et j'alloue la mémoire en me basant sur le procédé du tableau 2D de Médinoc
1 2 3 4
| typedef struct Image Image;
struct Image{
float **tabImage;
}; |
2.j'ai un tableau de pointeur 'tab2' qui contient les valeurs que je veux envoyer. Je recopie donc les valeurs de ce tableau dans ma structure.
1 2 3
| for(i=0;i<512;i++)
for(j=0;j<512;j++)
NewImage.tabImage[i][j]=tab2[i][j]; |
En testant avec printf("%.2f\n",NewImage.tabImage[y][x]); j'ai bien les valeurs qui sont recopiées dans ma structure, je l'envoie donc :
sock_err = send(csock, &(NewImage.tabImage[0][0]), 512*512*sizeof(float), 0);
3.À la réception je crée la même structure que j'alloue de la même façon et j'utilise recv() pour reprendre mes données ;
recv(sock, &(NewImage.tabImage[0][0]) ,512*512*sizeof(float), 0);
Et c'est justement en procédant de cette façon que j'arrive à envoyer uniquement une partie de l'information et s'arrête en plein milieu du tableau !
Du coup j'ai essayé d'appeler recv() en boucle mais j'ai toujours le même souci.
1 2 3 4
| do{
int retVal = recv(sock, chaine, sizeof(chaine) - 1, 0)!= SOCKET_ERROR;
}while(retVal < 0);
/*Je reste dans ma boucle tant qu'il y a des octets à envoyer */ |
ma question : est-ce qu'il y a une erreur dans ma façon de penser ? est-ce qu'il faut que j'envoie de la même manière la fonction send ?
effectuer autant d'appels à send qu'il y a de blocs non contigüs à traiter (c'est en général préférable s'il y a beaucoup de données à transmettre) ;
C'est une bonne idée effectivement, mais comment procède t-on ? Avec un for (exemple : (for i=0;i<nombre_de_ligne;i++) on envoie la ligne) et on procède de même à la réception ?
EDIT:
- Je viens aussi tester en envoyant non plus une matrice N*M, mais un vecteur contenant toutes les lignes à la suite (plus facile que d'envoyer une matrice) et j'ai exactement le même problème, j'envoie une partie et à partie d'un certain moment il n'envoie plus rien ! Du coup je pense effectivement que c'est un problème de taille de buffer, mais comment fait-on pour l'augmenter je vois pas comment je pourrais faire ?
Merci de votre aide
Partager