#1 

05-02-2007 19:19:21

Willikus
Membres
Avatar de Willikus
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 sad) peuvent jeter un coup d'oeuil au code (joints au ZIP) afin de désseler l'erreur. -> Aïe, Aïe, Aïe !


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


#2 

05-02-2007 21:02:30

kedu
Modérateurs
Avatar de kedu
Date d'inscription:
Messages: 155
IP: 212.194.217.246
Courriel

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


#3 

06-02-2007 17:42:23

Willikus
Membres
Avatar de Willikus
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


#4 

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


#5 

07-02-2007 17:04:35

Willikus
Membres
Avatar de Willikus
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


#6 

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


#7 

07-02-2007 20:51:23

Willikus
Membres
Avatar de Willikus
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


#8 

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


#9 

08-02-2007 09:10:00

Willikus
Membres
Avatar de Willikus
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


#10 

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


#11 

08-02-2007 15:22:08

Willikus
Membres
Avatar de Willikus
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


#12 

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


Hors ligne


#13 

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


#14 

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


#15 

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


#16 

01-03-2007 17:55:18

Willikus
Membres
Avatar de Willikus
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 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é
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
567 invités en ligne
membre en ligne: -
RSS Feed