05-02-2007 19:19:21
- Willikus
- Membres

- Date d'inscription:
- Messages: 150
- IP: 86.220.197.70
- Courriel Site web
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
Athlon 3000+ / 1024Mo PC3200 /8800 GTS
Hors ligne
05-02-2007 21:02:30
- kedu
- Modérateurs

- Date d'inscription:
- Messages: 155
- IP: 212.194.217.246
- Courriel
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
06-02-2007 17:42:23
- Willikus
- Membres

- Date d'inscription:
- Messages: 150
- IP: 86.220.214.5
- Courriel Site web
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
Athlon 3000+ / 1024Mo PC3200 /8800 GTS
Hors ligne
07-02-2007 14:54:12
- smeagol
- Membres
- Date d'inscription:
- Messages: 34
- IP: 193.55.51.9
- Courriel
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
07-02-2007 17:04:35
- Willikus
- Membres

- Date d'inscription:
- Messages: 150
- IP: 86.220.228.71
- Courriel Site web
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
Athlon 3000+ / 1024Mo PC3200 /8800 GTS
Hors ligne
07-02-2007 18:29:08
- Jerry Kan
- Membres
- Date d'inscription:
- Messages: 265
- IP: 82.243.77.149
- Courriel
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++
Hors ligne
07-02-2007 20:51:23
- Willikus
- Membres

- Date d'inscription:
- Messages: 150
- IP: 86.220.228.71
- Courriel Site web
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 !
Athlon 3000+ / 1024Mo PC3200 /8800 GTS
Hors ligne
07-02-2007 22:13:11
- Jerry Kan
- Membres
- Date d'inscription:
- Messages: 265
- IP: 82.243.77.149
- Courriel
Willikus Ecris:
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
Hors ligne
08-02-2007 09:10:00
- Willikus
- Membres

- Date d'inscription:
- Messages: 150
- IP: 86.220.208.141
- Courriel Site web
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... ^^
Athlon 3000+ / 1024Mo PC3200 /8800 GTS
Hors ligne
08-02-2007 11:39:19
- Jerry Kan
- Membres
- Date d'inscription:
- Messages: 265
- IP: 139.124.21.131
- Courriel
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
08-02-2007 15:22:08
- Willikus
- Membres

- Date d'inscription:
- Messages: 150
- IP: 86.220.208.141
- Courriel Site web
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 !
Athlon 3000+ / 1024Mo PC3200 /8800 GTS
Hors ligne
09-02-2007 11:45:23
- Jerry Kan
- Membres
- Date d'inscription:
- Messages: 265
- IP: 82.243.77.149
- Courriel
Willikus Ecris:
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 ^^
Hors ligne
09-02-2007 12:25:16
- Jerry Kan
- Membres
- Date d'inscription:
- Messages: 265
- IP: 82.243.77.149
- Courriel
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
09-02-2007 19:27:15
- Jerry Kan
- Membres
- Date d'inscription:
- Messages: 265
- IP: 82.243.77.149
- Courriel
pour du réseau "les mains dans le camboui" mais sous windows, faut suivre ca :
http://www.frameip.com/c-mode-connecte/
Hors ligne
01-03-2007 10:24:53
- katsankat
- Membres
- Date d'inscription:
- Messages: 43
- IP: 82.122.68.202
- Courriel
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
01-03-2007 17:55:18
- Willikus
- Membres

- Date d'inscription:
- Messages: 150
- IP: 90.25.118.222
- Courriel Site web
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é ^^
Athlon 3000+ / 1024Mo PC3200 /8800 GTS
Hors ligne



