Envoi structure en C via socket

RoZyk Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   -  
RoZyk Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour tout le monde,

J'essaye d'envoyer une structure via des sockets en C. J'ai un premier processus envoi_struct et un 2ème recoit_struct.

envoi_struct (après connexion de mes sockets):

                printf("Attente d'un client...\n");                 /*Attente de la connexion d'un client*/
                csock = accept(sock, (SOCKADDR*)&csin, &crecsize);  /*Acceptation de la connexion client*/
                printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));


                printf("Buffer: %s\n",buff.Buffer);
                printf("Fin de fichier: %d\n", buff.finFich);
                send(sock, (char*)&buff, sizeof(buff), 0);


recoit_struct :

        printf("Client connecte\n");

        recv(sock, (char*)&buff, sizeof(buff), 0);

        printf("Buffer: %s\n", buff.Buffer);
        printf("Fin de fichier: %d\n", buff.finFich);
        getchar();


Mon problème? Je n'ai pas les mêmes valeurs quand j'écris mon "Buffer" et mon "Fin de fichier"...

Merci pour vos futures réponses.


4 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
met ta structure buffer stp.
0
RoZyk Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   3
 
Tu crois vraiment que ma structure à quelque chose à voir avec mon problème de transmission?

struct sFich
{
    char Buffer[512];
    int finFich;
};
typedef struct sFich sFich;
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
maintenant, non.
Mais j'ai déjà vu des gars qui voulaient envoyer des structures avec des pointeurs dedans. Comme ça, nous sommes sur ;-)
0
RoZyk Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   3
 
Je pense avoir trouver le problème. C'est un problème de prototype de fonction, sur les tutoriels trouvaient sur internet, le prototype de send est:
int send(int socket, void* buffer, size_t len, int flags);


Hors dans ma bibliothèque winsock2.h j'ai:
int send(int socket, char* buffer, size_t len, int flags);


Pourrais tu regarder dans ta bibliothèque winsock2.h voir le prototype de ta fonction send? Pour savoir enfin si c'est moi qui merde ou si internet dit de la m****...
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
Pour savoir enfin si c'est moi qui merde ou si internet dit de la m****
ni l'un ni l'autre.
Sous windows, le prototype est bien en char*, sous Posix (Linux, Unix BSd) en void*.
J'avais deviner le windows à cause du char* ;-)
Au final, ça ne change rien, tu donne un pointeur, peu importe qu'il soit char void ou toto.
Sauf si ce gros crétin de windows vérifie s'il y a un retrou à la ligne, un espace ou un caractère nul.
Fait ce que je te conseil dans le message en dessous, en particulier les retours de send et recv. On y verra plus clair après.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Je ne vois pas trop d'où peut venir l'erreur.

Je n'aime pas trop l'opérateur sizeof. Essai de mettre sizeof(sFich) à la place de sizeof(buff) ; (même si c'est con, ça ne coute pas grand chose à tester)

Dans le même ordre d'idée, teste et affiche les valeurs renvoyées par send et recv. ça devrais être 516.

Si c'est ça, essai en mettant directement 516 (512*sizeof(char)/*==1*/+ sizeof(int)/*==4*/) dans send et recv.

Tiens nous au courant.
0
RoZyk Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   3
 
J'avais déjà essayer ta version, merci bcp pour ton aide, et le fait que ce soit char* nous posait bel et bien puisque gcc nous signalait un warning. Nous avons donc contourner le problème envoyant une chaine de caractère avec FIN en début de chaine pour signaler la fin. Et on fait un while recevoir trame tant que les 3 1er caractère sont différents de 'FIN'.

Merci bcp

Bonne fin de journée
0