[C] Ecrire un protocol de communication

Ecrire un protocol de communication [C] - C++ - Programmation

Marsh Posté le 26-06-2002 à 16:35:57    

Voila, je suis entrain (d'essaier ;) ) de faire un jeu de carte multijoueur. J'ai donc un prog server et un prog client.
Je suis entrain de faire le protocol (cad la maniere dont vont discuter mes 2 progs); j'aimerais savoir si ce que je fait tiens la route ou si c foireux (etant autodidacte, j'ai jamais eu de cours de prog, donc j'ai quasi tout fait a l'intuition :) )
 
J'envois mes donnees par 'packet', je definis une taille max pour mes packets (c po fixe en dur ds le code, c juste un define a changer).
Un packet se presente comme suit:
:<longeur_total_des_donnees>:<id_des_donnees>:<no_packet>:<id_client>:<action>:<donnes>:
 
Si la longeur totale de toutes les donnees ne sais pas tenir ds un seul 'packet' alors elle est splitte en plusieurs 'packets' ayant le meme <id_donnees> et en incrementant a chaque fois le <no_packet>.
 
Tache donc au prog de l'autre cote de recevoir ces 'packets' les stocker puis les remettre dans l'ordre qd il a tout.
J'avais pense a faire un systeme de pile ou un truc du genre, mais je me rends compte que ca risque d'etre assez foireux et pas forcement robuste & performant.
 
J'aimerais donc avoir votre avis pour savoir si la maniere dont je dispose les donnes dans un packet est po trop debile.
Si ca vaut la peine que je m'amuse a splitter les longues donnnes en plusieurs packet sachant que je travaille en TCP.
 
merci bien :)  


---------------
Join us now and share the software;
Reply

Marsh Posté le 26-06-2002 à 16:35:57   

Reply

Marsh Posté le 27-06-2002 à 18:11:44    

ca inspire personne??


---------------
Join us now and share the software;
Reply

Marsh Posté le 27-06-2002 à 20:24:40    

Houla, ce serait p'tet plus simple de travailler en mode connecté avec des sockets, plutôt que de t'enmerder avec tes paquets, non ?  :??:

Reply

Marsh Posté le 27-06-2002 à 22:58:44    

ben suis en mode connecte (TCP) et c bien avec des sockets.
Qd je parle de 'packet' c une 'unite' d'information que j'envois entre le client et le server


---------------
Join us now and share the software;
Reply

Marsh Posté le 27-06-2002 à 23:22:14    

cassidy a écrit a écrit :

ben suis en mode connecte (TCP) et c bien avec des sockets.
Qd je parle de 'packet' c une 'unite' d'information que j'envois entre le client et le server




envoie directe une struct
 
cote server
 
t_ma_structure *toto
 
write(fd_socket, toto , sizeof(t_ma_structure));
 
 
cote client
 
read(fd_socket, toto , sizeof(t_ma_structure));


---------------
télétunestel ouimélétuness sitélétunes mélétunetron [:koulip31] [:suri]
Reply

Marsh Posté le 27-06-2002 à 23:41:04    

on sait envoier des structures comme ca???
et ben, avais po pense a ca..
v regarder de ce cote la
 
sinon je doa tjs m'amuser a splitter mes donnes en tit packet ou je  peut directos envoier tout comme un bourin?


---------------
Join us now and share the software;
Reply

Marsh Posté le 28-06-2002 à 00:40:55    

koulip31 a écrit a écrit :

 
 
tu peux les envoiller comme un bourin seul truc  
faut reader de la bonne taille de l'autre cote  
 
ccl pour ton bp
 
une struct
 
stypedef struct s_carte  
{
 int id_data;
 int nro_paquet;
 int action;
 char data[128];    (exemple pour du texte)  
}
 
et zou  
 
de lautre cote tu lit la meme structure et plus de pb de  
concat + deconcat and co ....  




Message édité par koulip31 le 28-06-2002 à 00:41:51

---------------
télétunestel ouimélétuness sitélétunes mélétunetron [:koulip31] [:suri]
Reply

Marsh Posté le 28-06-2002 à 11:00:19    

merci bien :)
 
donc je fixe une valeur en dur pour data, ca veut dire que je devrais encore splitter mes commandes en plusieurs packets.
 
koike dans un 1er temps je pourrais me contenter de fixer une longeur max par commande et plus tard, si besoin est, m'amuser a splitter en plusieurs packets les longues commandes.
Dans ce cas la, je devrais faire un genre de pile ou un truc du genre pour stocker les packets non entier et les reconstitues apres, non?


---------------
Join us now and share the software;
Reply

Marsh Posté le 28-06-2002 à 11:11:21    

cassidy a écrit a écrit :

merci bien :)  
 
donc je fixe une valeur en dur pour data, ca veut dire que je devrais encore splitter mes commandes en plusieurs packets.  
 
koike dans un 1er temps je pourrais me contenter de fixer une longeur max par commande et plus tard, si besoin est, m'amuser a splitter en plusieurs packets les longues commandes.  
Dans ce cas la, je devrais faire un genre de pile ou un truc du genre pour stocker les packets non entier et les reconstitues apres, non?  
 




 
si jai bine compris ce que tu fait c'eest tu cree une chaine ayant cette geule
 
 
:123: 45:1234567:3:8:6
 
pour les action tassocie 1 chifre a une action  
de meme pour les donnees  
tu fait une table de "corespondance" action / chiffre assoscie
 
donc sa te fait une structure avec 6 ints
et zou ya plus de pb
ou tecrits tes 6 ints l'un derrier l'autre sur la socket mais la fait attention de pas avir de decalage
 
 
si tu  veux garder tn systeme  
tu fait une boucle  
while(kkechose _lir_sur_la _socket && char _de _fin _de_ commande _pas_ trouve)
 concatenner ;
 
en gros voila :P  
 
 


---------------
télétunestel ouimélétuness sitélétunes mélétunetron [:koulip31] [:suri]
Reply

Marsh Posté le 28-06-2002 à 11:20:52    


nan enfait c'est plutot
 
:4:12:1:2:r:bonjour:
 
l'action est coder sur un char et les donnees sont une chaine.
Au debut je voulais faire que qd les donnees etait trop longues, elle etait splitte en plusieurs packets, mais je pense que je vais me contenter que d'un packet a la fois ds un 1er temps.
Je vais regarder a ton idee de passer directos la struct, ca me simplifierait grandement la vie.


---------------
Join us now and share the software;
Reply

Marsh Posté le 28-06-2002 à 11:20:52   

Reply

Marsh Posté le 28-06-2002 à 17:13:20    

cassidy a écrit a écrit :

   
nan enfait c'est plutot  
   
:4:12:1:2:r:bonjour:  
   
l'action est coder sur un char et les donnees sont une chaine.  
Au debut je voulais faire que qd les donnees etait trop longues, elle etait splitte en plusieurs packets, mais je pense que je vais me contenter que d'un packet a la fois ds un 1er temps.  
Je vais regarder a ton idee de passer directos la struct, ca me simplifierait grandement la vie.  
 



 
 
je supose que les datas c'est pour la parite chat de ton jeu ??  
si c'est le cas le plus simple est d'ouvrir une seconde socket specialise a cet effet    
ca serrat a la fois plus clair au niveau code  
et plus simple a gerrer a mon avis
 
vas faire un tour du cote de www.gamedev.net  
section article/tuto yen a pas mal sur le reseau  
server bloquants / non bloqants  
theorie + exemples de code  
 
c'est tres instructif de plus tapprend des choses a cote


Message édité par koulip31 le 28-06-2002 à 17:15:10

---------------
télétunestel ouimélétuness sitélétunes mélétunetron [:koulip31] [:suri]
Reply

Marsh Posté le 28-06-2002 à 18:39:17    

yep c pour le chat
 
enfin je pense que ca devrait aller, j'ai rajoute un char pour faire une 'sous-action'
avec action & sous action je devrait pouvoir faire la plupart de mes commandes du jeu sans rajouter de donnees ds data.
 
thx pour le lien, v aller jeter un  oeil
 


---------------
Join us now and share the software;
Reply

Marsh Posté le 28-06-2002 à 23:48:15    

Franchement faire des paquets, les splitter, ... je vois pas franchement l'intérêt, de plus tu parles de "remettre en ordre les paquets", en mode connecté (TCP) tes données arriveront toujours dans le bon ordre, par contre cela prendrait tout son intérêt si tu transmettais les données avec UDP pour avoir du pseudo temps réel (c souvent le cas dans les jeux 3D). Vu que les données que tu transmets sont toutes petites et pour faciliter le codage (et éventuellement le déboguage), je pense que tu complique inutilement les choses.
 
J'ajouterais que la question des perfs ne se pose même pas pour des échanges de qq 10aines d'octets à chaque fois.

Reply

Marsh Posté le 29-06-2002 à 01:54:56    

[citation]
J'ajouterais que la question des perfs ne se pose même pas pour des échanges de qq 10aines d'octets à chaque fois.
[/citation]
 
sa depend du trafic sur le reseau  
10octec nest pas totalement negligeable pour certainne api
c'est un peut comme les boucles dans les moteurs 3D ;)  
 
ouvre 2 socket c'est le truc le plus simple et le plus propre q mon avis ;)  
 
si tu trouve pas ton bonheur sur gamedev je pourrais tenvoiller 2/3 sources


---------------
télétunestel ouimélétuness sitélétunes mélétunetron [:koulip31] [:suri]
Reply

Marsh Posté le 29-06-2002 à 11:36:47    

yep je pense que je vais faire comme ca. un packet a la fois et laisser TCP faire son boulot :)
 
Assez interessant gamedev, mais pas mal sur les winsock (je code sous GNU/Linux).
Enfin ca va, je devrais reussi a me debrouiller comme ca :)
 
merci bien  :hello:


---------------
Join us now and share the software;
Reply

Marsh Posté le 29-06-2002 à 11:47:34    

Si tu veux faire des sockets multi plateformes, tu as la lib ACE
http://www.cs.wustl.edu/~schmidt/ACE-overview.html
Par contre, c'est assez gros... (parce qu'il y a des sockets, des threads...). C'est tres rapide (presque autant que l'API de ton systeme, la surcouche est tres fine)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed