Envoi structure en C via socket

Fermé
RoZyk Messages postés 78 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 16 mars 2011 - 28 oct. 2010 à 12:20
RoZyk Messages postés 78 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 16 mars 2011 - 28 oct. 2010 à 17:06
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 vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
28 oct. 2010 à 12:47
met ta structure buffer stp.
0
RoZyk Messages postés 78 Date d'inscription mardi 23 février 2010 Statut Membre Dernière intervention 16 mars 2011 3
28 oct. 2010 à 14:37
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 vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
28 oct. 2010 à 15:56
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 mardi 23 février 2010 Statut Membre Dernière intervention 16 mars 2011 3
28 oct. 2010 à 16:07
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 vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
28 oct. 2010 à 16:16
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 vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
28 oct. 2010 à 16:05
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 mardi 23 février 2010 Statut Membre Dernière intervention 16 mars 2011 3
28 oct. 2010 à 17:06
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