#0 

05-02-2007 20:19:21

Willikus
Abonné
Date d'inscription: 21-10-2006
Messages: 150
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 sad) 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)


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


#1 

05-02-2007 22:02:30

kedu
Modérateur
Date d'inscription: 23-09-2006
Messages: 155

Ca sent la mauvaise gestion du codage de char ça smile

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


#2 

06-02-2007 18:42:23

Willikus
Abonné
Date d'inscription: 21-10-2006
Messages: 150
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

Dernière modification par Willikus (06-02-2007 18:42:49)


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


#3 

07-02-2007 15:54:12

smeagol
Membre
Date d'inscription: 30-10-2006
Messages: 34

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


#4 

07-02-2007 18:04:35

Willikus
Abonné
Date d'inscription: 21-10-2006
Messages: 150
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:

Code:

 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:

Code:

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)


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


#5 

07-02-2007 19:29:08

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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


Code:

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


#6 

07-02-2007 21:51:23

Willikus
Abonné
Date d'inscription: 21-10-2006
Messages: 150
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


#7 

07-02-2007 23:13:11

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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


#8 

08-02-2007 10:10:00

Willikus
Abonné
Date d'inscription: 21-10-2006
Messages: 150
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... ^^

Dernière modification par Willikus (08-02-2007 10:10:42)


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


#9 

08-02-2007 12:39:19

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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


#10 

08-02-2007 16:22:08

Willikus
Abonné
Date d'inscription: 21-10-2006
Messages: 150
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


#11 

09-02-2007 12:45:23

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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 ? big_smile

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


#12 

09-02-2007 13:25:16

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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


#13 

09-02-2007 20:27:15

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

pour du réseau "les mains dans le camboui" mais sous windows, faut suivre ca :

http://www.frameip.com/c-mode-connecte/

Hors ligne


#14 

01-03-2007 11:24:53

katsankat
Membre
Date d'inscription: 24-02-2007
Messages: 43

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


#15 

01-03-2007 18:55:18

Willikus
Abonné
Date d'inscription: 21-10-2006
Messages: 150
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 wink
Si tu arrive a faire un transfere de fichier, je suis interessé ^^


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
16 invités en ligne
Aucun membre connecté
RSS Feed