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 -
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):
recoit_struct :
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.
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.
A voir également:
- Envoi structure en C via socket
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Votre envoi est en préparation pour sa distribution. ✓ - Forum Consommation & Internet
- Dans la table des matières du document à télécharger, le chapitre 6 et ses 2 sections n'apparaissent pas. trouvez l'erreur dans la structure du document et corrigez-la. mettez à jour la table des matières. quel est le mot formé par les lettres en majuscules de la table des matières après sa mise à jour ? - Forum Word
- Programmer envoi sms - Guide
- Envoi en cci - Guide
4 réponses
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;
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:
Hors dans ma bibliothèque winsock2.h j'ai:
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****...
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****...
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.
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.
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.
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.
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
Merci bcp
Bonne fin de journée