Salut !
Je suis en train de mettre un serveur/client précaire pour un auto updater (tout aussi précaire)...
J'ai écrit avec la libraire RakNet 2.210 un code permettant au serveur de lire un fichier (en binaire théoriquement), puis de l'envoyer au client caractère par caractère, qu'il va réécrire lui même sous forme de chaine de 1 caractère qu'il mais bout a bout...
Voir le Fichier : serveurclient.zip
Seulement, 3 GROS problème que je n'arrive pas a résoudre...
-A la fin de mon fichier .doc, il me met toujours "ÿ".
-La taille Max du fichier refomer ne dépasse pas 8Ko
-Un fichier binaire est érroné !
Données,
j'ai essayer de lire un fichier caractere par Car., puis de l'écrire dans la même boucle, le fichier fonctionne !
Pour exporter par RakNet, je doit passer du "int" iniale de caractère, a "char", je ne sais pas si apres ça marche...
Si quelqu'un connait cette bibliothèque, merci de m'aider.
Sinon, les vrai programmeurs (pas mon cas ) peuvent jeter un coup d'oeuil au code (joints au ZIP) afin de désseler l'erreur. -> Aïe, Aïe, Aïe !
Dernière modification par Willikus (05-02-2007 20:19:45)
Hors ligne
Ca sent la mauvaise gestion du codage de char ça
Il faut que tu saches en quel mode tu dois ecrire ces chars utf16 - utf32 - unicode - ansi - ...
En gros voilà le problème : il y a plusieurs façon de coder un char (certaines normes utiliseront un poid en octet faible, d'autres en utilisent bcp plus...) Bref à tous les coups ta conversion binaire - char - binaire (ou l'inverse dans ton cas) ne se fait pas dans la même norme de codage.
Je ne suis plus du tout habitué à la syntaxe c++, aussi je laisse le soin à d'autres d'examiner ton code ; mais à mon avis le problème se situe là.
Hors ligne
Oui, mais théoriquement... si le programme est binaire, int doit valoire 0 ou 1. Hors, pour la conversion, il me renvoie NULL, signe d'echec de conversion...
(De plus, si je demande d'afficher de tel maniere : printf("%c", int); , il m'écrit le texte en caractère !)
Y a t'il des façon d'ouvrir les fichiers afin de les avoir en binaire...
Parce que la je l'ouvre et je lui dit que je travail en binaire (ab), mais les fonctions de recup et d'écriture sont celle fait pour le texte...
Pour les 8Kos max, je pense savoir...
Je travail avec une fonction nommé RPC il me semble, il vaudrait mieux du BitStream ? (d'apres la definition de bitstream...)
a+
merci
Dernière modification par Willikus (06-02-2007 18:42:49)
Hors ligne
Il faut bien que tu ouvre ton fichier en mode binaire a la lecture et a l'écriture.
Le problème vien forcement de là. Où alors tu écrit un caractère de trop a chaque fois
Hors ligne
Donc, j'ai changer je ne sais quoi et j'obtient quelque chose de mieux...
Je peux dépasser les 8Ko...
Et je peux disserner un code a peu pres bon dans la copie... seulement, les valeur NULL ne sont pas copier :
Image de comparaison de la contenance des 2 fichiers. En bas, la copie :
Pour ce faire, je fonctionne comme ça :
Coté Serveur:
do { //fread(&lecture,sizeof(1),1,fichier01); caractereActuel = fgetc(fichier01); // On lit le caractère //fprintf(fichier02c, "%c", caractereActuel); sprintf(transfere, "%c", caractereActuel); rakServerInterface->RPC("Transfere", transfere, (strlen(transfere)+1)*8, HIGH_PRIORITY, RELIABLE_ORDERED, 0, UNASSIGNED_PLAYER_ID , true, false); } while (caractereActuel != EOF); fclose(fichier01);
Coté Client:
void Transfere(char *input, int numberOfBitsOfData, PlayerID sender) { fichier02c = fopen(fichierc, "ab"); //fwrite(&input,sizeof(1),1,fichier02c); fputs(input, fichier02c); //fprintf(fichier02c, "%s"); printf("%s",input); fclose(fichier02c); }
Donc le serveur envoie caractère par caractère le message a la fonction Transfere qui est lu en boucle par le client.
Voilà mes new infos
Dernière modification par Willikus (07-02-2007 18:05:08)
Hors ligne
faut pas que tu lise ton fichier caractere par caractere, c'est pas la bonne approche a mon avis
comme dit smeagol, faut que tu ouvre le fichier en mode binaire, et que tu le lise octet par octet, ou groupe d'octet par groupe d'octet, cherche dans les fonctions dispos ya des trucs qui font ca,
je me souvient qu'en C je faisait un truc du style : fread et fwrite
size t fread(void *destination, size t taille, size t nombre, FILE *flot) Cette fonction essaye de lire sur le flot indiqué nombre objets, chacun ayant la taille indiquée, et les copie les uns µa la suite des autres dans l'espace pointé par destination. Elle renvoie le nombre d'objets efectivement lus, qui peut etre inférieur au nombre demandé, a cause de la rencontre de la fin du fichier, d'une erreur, etc. size t fwrite(const void *source, size t taille, size t nombre, FILE *flot) Cette fonction écrit les nombre objets, chacun ayant la taille indiquée, qui se trouvent les uns µa la suite des autres µa l'adresse indiquée par source. Elle renvoie le nombre d'objets écrits, qui peut ^etre inférieur au nombre demandé (en cas d'erreur).
attention c'est du C, pas du C++
Dernière modification par Jerry Kan (07-02-2007 19:30:59)
Hors ligne
Pour ouvrir un fichier en binaire c'est bien "fichier = fopen("fichier.ext", "rb");" ?
Pour fread et fwrite :
void *destination = pointeur vers le stockage de la chose lu
size t taille = taille de l'objet (ici 2 octet pour du binaire)
size t nombre = le nombre d'objet ?
FILE *flot = le fichier.
Pour le caractère / caractère, j'avais opter pour ça, vu que c'est du reseau... (alleger l'intensité du transfere).
Merci de votre aide !
Hors ligne
Willikus :
Pour le caractère / caractère, j'avais opter pour ça, vu que c'est du reseau... (alleger l'intensité du transfere).
a une époque je faisais du réseau sans librairie, et on utilisait un buffer dans lequel on empilait les caracteres qu'on voulais transferer et des qu'on l'avait rempli, flush et hop (j'ai toujours le code si ca branche des gens, mais c'est artisanal, on cree sa socket, on l'ouvre etc etc)
en théorie tu devrai aussi avoir ce genre de trucs dans Rakknet
Dernière modification par Jerry Kan (07-02-2007 23:14:18)
Hors ligne
Oui, je pense... mais il n'ya pas d'API (faut lire les librairie) et les tutos sont primitif et valent juste une intro
Je veut bien ton code stp, rien que pour voir si je peux adapter... ^^
Dernière modification par Willikus (08-02-2007 10:10:42)
Hors ligne
envoyé ^^
j'ai fait ca sous linux, c'est pas trop possible de faire du réseau avec les primitives de bases sous windows, l'api et les structures fournies de base sont trop foireuses pour faire du réseau
Hors ligne
Merci !
C'est vraiment du même genre que Raknet, je ne voit pas pourquoi ça ne marcherais pas !
Bon, il va falloir que je poursuive mais recherche !
(Quelqu'un sait a quoi servent ces : #pragma(push,1), ...
Parceque il y a un conflit de ces items avec le grassnode, et impossible de ne pas les supprimé... et fonctionne toujours sans !
Hors ligne
Willikus :
C'est vraiment du même genre que Raknet, je ne voit pas pourquoi ça ne marcherais pas !
surement parce que c'est plein de primitives systèmes linux ?
en tout cas si tu veux des explications sur le contenu (le code est pas super commenté), n'hésites pas a me mailler, j'en ai refait il a pas trop longtemps, et c'est encore frais ^^
Dernière modification par Jerry Kan (09-02-2007 13:18:26)
Hors ligne
tiens je viens justement de retomber sur un lien, je pense que j'utiliserai GNET si je devait refaire du réseau, ca t'interressera peut etre :
http://www.gnetlibrary.org/
Hors ligne
pour du réseau "les mains dans le camboui" mais sous windows, faut suivre ca :
http://www.frameip.com/c-mode-connecte/
Hors ligne
Salut,
En général , on envoie paquet par paquet, pas caractère par caractère. Ca augmente les performances. Des paquets de 1000/1500 octets vont bien.
Ensuite, les NULL n'apparaissent pas parce qu'en C/C++ ils représentent le zéro de terminaison d'une chaîne de caractères. Quant tu fais un sprintf() la fonction interprète ce que tu lui passe et stoppe au premier 0 rencontré (j'ai dit 0, pas '0'). Idem pour le strlen()!!!! Théoriquement pas besoin ni de sprintf, ni de strlen: un fread de 1500 octets retournera la longueur effectivement lue, voir le prototype de fread().
Sinon l'idée à l' air sympa, ça me dirait bien d'essayer le programme si tu le distribues.
Hors ligne
Alors... je suis désolé mais a force de "tripoter" dans tous les sens ce code, le programme est HS et le code dans le même état.
Cependant, si tu est interessé, j'ai un system de "chat" sur console et une integration +- précaire sur irrlicht.
Apres avec le client/serveur, tu peut faire en sorte de lire un fichier a tes souhaits et en faire un patcher.
Chat : Voir le Fichier : chat.7z
Si tu veux malgré tout l'épave de l'autopatcher, je te le passerais
Si tu arrive a faire un transfere de fichier, je suis interessé ^^
Hors ligne