C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Transmissions réseau
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Bloutiouf
Guest





PostPosted: Wed Mar 08, 2006 2:06 pm    Post subject: Transmissions réseau Reply with quote



Bonjour,

Je ne sais pas si je suis sur le bon groupe, mais je n'en trouve pas de
plus adaptés que celui-ci. Je développe une petite application réseau
(un serveur, chaque client se connecte dessus) mais j'ai un doute.

Globalement, ce sont des chaines qui sont envoyées par socket et mises
dans un buffer. Ces chaines contiennent logiquement une commande et tous
les paramètres. J'ai fait un premier jet de mon travail, en séparant les
commandes par Â, les paramètres par Ê, etc. m'étant dit qu'en langue, on
ne met pas d'accent sur des majuscules donc qu'on utiliserait pas ces
caractères, au passage que j'interdis (je les transforme en A, E, etc).
Ca marche bien, les commandes sont donc du genre
"loginÊmyloginÊmypasswordÂ" (le  est à la fin pour vérifier qu'on a
bien dans le buffer la totalité de la commande).

Seulement, je me dis que c'est pas très professionnel, et qu'il devrait
bien exister des solutions (quant à ces  et tout). Les recherches sur
google ne sont capables que de me dire comment sont connectés les clients...

Je m'adresse à toute personne ayant déjà fait une telle application,
évidemment celles qui ont des idées aussi :p , pour me dire comment
elles ont fait / auraient fait. Merci beaucoup.

Cordialement.
Back to top
Marc Boyer
Guest





PostPosted: Wed Mar 08, 2006 3:01 pm    Post subject: Re: Transmissions réseau Reply with quote



Le 08-03-2006, Bloutiouf <bloutiouf (AT) wanadoo (DOT) fr> a écrit :
Quote:
Bonjour,

Je ne sais pas si je suis sur le bon groupe, mais je n'en trouve pas de
plus adaptés que celui-ci. Je développe une petite application réseau
(un serveur, chaque client se connecte dessus) mais j'ai un doute.

Globalement, ce sont des chaines qui sont envoyées par socket et mises
dans un buffer. Ces chaines contiennent logiquement une commande et tous
les paramètres. J'ai fait un premier jet de mon travail, en séparant les
commandes par Â, les paramètres par Ê, etc. m'étant dit qu'en langue, on
ne met pas d'accent sur des majuscules donc qu'on utiliserait pas ces
caractères, au passage que j'interdis (je les transforme en A, E, etc).
Ca marche bien, les commandes sont donc du genre
"loginÊmyloginÊmypasswordÂ" (le  est à la fin pour vérifier qu'on a
bien dans le buffer la totalité de la commande).

Et si tu utilisais la bonne vieille convention des shells:
séparateur ' ', et conversion ' ' -> "\ ", '\' -> "\\".

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exiter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)
Back to top
Bloutiouf
Guest





PostPosted: Wed Mar 08, 2006 3:06 pm    Post subject: Re: Transmissions réseau Reply with quote



Le problème étant que je ne connais pas à l'avance la commande, vu
qu'elle se situe dans la chaine envoyée. Le serveur ne peut pas deviner
a l'avance que tel joueur va faire telle action par exemple.

Cela dit, pour chaque commande, les paramètres sont fixés, par exemple
pour le login de l'exemple, c'est toujours suivi du login et du password.

BOUCNIAUX Benjamin wrote:
Quote:
Je vais dire ca comme ca, mais ne pourrais tu pas 'structurer' tes
commandes (en gros définir ce qu'elles vont contenir, de manière à
pouvoir les typer).
Ensuite, tu les envoies sur le réseau, tu les receptionnes dans un buffer
ayant la meme structure, et tu peux ensuite récupérer les champs
nécessaires.
Cela dit, il faudrait que tu connaisses le format de tes commandes, le
nombre d'arguments à passer, etc etc...
Back to top
BOUCNIAUX Benjamin
Guest





PostPosted: Wed Mar 08, 2006 3:06 pm    Post subject: Re: Transmissions réseau Reply with quote

Le Wed, 08 Mar 2006 14:44:21 +0100, Bloutiouf a écrit :

Quote:
Bonjour,


Bonjour,

Quote:
Je ne sais pas si je suis sur le bon groupe, mais je n'en trouve pas de
plus adaptés que celui-ci. Je développe une petite application réseau
(un serveur, chaque client se connecte dessus) mais j'ai un doute.

Globalement, ce sont des chaines qui sont envoyées par socket et mises
dans un buffer. Ces chaines contiennent logiquement une commande et tous
les paramètres. J'ai fait un premier jet de mon travail, en séparant les
commandes par Â, les paramètres par Ê, etc. m'étant dit qu'en langue, on
ne met pas d'accent sur des majuscules donc qu'on utiliserait pas ces
caractères, au passage que j'interdis (je les transforme en A, E, etc).
Ca marche bien, les commandes sont donc du genre
"loginÊmyloginÊmypasswordÂ" (le  est à la fin pour vérifier qu'on a
bien dans le buffer la totalité de la commande).

Seulement, je me dis que c'est pas très professionnel, et qu'il devrait
bien exister des solutions (quant à ces  et tout). Les recherches sur
google ne sont capables que de me dire comment sont connectés les clients...

Je m'adresse à toute personne ayant déjà fait une telle application,
évidemment celles qui ont des idées aussi :p , pour me dire comment
elles ont fait / auraient fait. Merci beaucoup.

Cordialement.

Je vais dire ca comme ca, mais ne pourrais tu pas 'structurer' tes
commandes (en gros définir ce qu'elles vont contenir, de manière à
pouvoir les typer).
Ensuite, tu les envoies sur le réseau, tu les receptionnes dans un buffer
ayant la meme structure, et tu peux ensuite récupérer les champs
nécessaires.
Cela dit, il faudrait que tu connaisses le format de tes commandes, le
nombre d'arguments à passer, etc etc...
Back to top
Marc Boyer
Guest





PostPosted: Wed Mar 08, 2006 3:26 pm    Post subject: Re: Transmissions réseau Reply with quote

Le 08-03-2006, Bloutiouf <bloutiouf (AT) wanadoo (DOT) fr> a écrit :
Quote:
Hm... A la rigueur, je pense que mon bidouillage serait plus facile à
mettre en place que cette convention, d'autant plus qu'elle prend un peu
plus de place (eh oui réseau oblige... enfin c'est rien trois octets de
plus).

Tu peux faire une compression si tu veux, mais de nos jours,
à moins d'un cadre très précis, il me semble pas que l'overhead
soit vraiment pénalisant.

Quote:
On veut le 3eme paramètre : on cherche 3 fois le caractère Ê et
on recupère la chaine jusqu'au prochain, tandis que là il faut vérifier
si le caractère n'est pas précédé d'un \ mais qu'il peut en être précédé
de deux...

Non, sur fclc++, on met le tout à la réception dans un
std::vector<string> (ou std::dequeu<string>), et on fait un
accès par at ou [].
Il ne faut pas confondre le format de transfer réseau
et le format de manipulation.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exiter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)
Back to top
Bloutiouf
Guest





PostPosted: Wed Mar 08, 2006 4:06 pm    Post subject: Re: Transmissions réseau Reply with quote

Oula ! Surcharge surcharge Wink c'est vrai que ca serait une bonne
solution, s'il ne fallait pas réduire presque au maximum la taille de la
chaine (ca occupe de la bande passante tout ca).

François-Xavier GENDRIN wrote:
> Pourquoi ne pas faire du XML ? Quitte à faire du texte ...
Back to top
François-Xavier GENDRIN
Guest





PostPosted: Wed Mar 08, 2006 4:06 pm    Post subject: Re: Transmissions réseau Reply with quote

Bloutiouf a écrit :
Quote:
Le problème étant que je ne connais pas à l'avance la commande, vu
qu'elle se situe dans la chaine envoyée. Le serveur ne peut pas deviner
a l'avance que tel joueur va faire telle action par exemple.

Cela dit, pour chaque commande, les paramètres sont fixés, par exemple
pour le login de l'exemple, c'est toujours suivi du login et du password.

Pourquoi ne pas faire du XML ? Quitte à faire du texte ...
--
FX
Back to top
Bloutiouf
Guest





PostPosted: Wed Mar 08, 2006 4:06 pm    Post subject: Re: Transmissions réseau Reply with quote

Hm... A la rigueur, je pense que mon bidouillage serait plus facile à
mettre en place que cette convention, d'autant plus qu'elle prend un peu
plus de place (eh oui réseau oblige... enfin c'est rien trois octets de
plus). On veut le 3eme paramètre : on cherche 3 fois le caractère Ê et
on recupère la chaine jusqu'au prochain, tandis que là il faut vérifier
si le caractère n'est pas précédé d'un \ mais qu'il peut en être précédé
de deux...

Marc Boyer wrote:
Quote:
Et si tu utilisais la bonne vieille convention des shells:
séparateur ' ', et conversion ' ' -> "\ ", '\' -> "\\".

Marc Boyer
Back to top
Marc Boyer
Guest





PostPosted: Wed Mar 08, 2006 4:48 pm    Post subject: Re: Transmissions réseau Reply with quote

Le 08-03-2006, Bloutiouf <bloutiouf (AT) wanadoo (DOT) fr> a écrit :
Quote:
Autrement dit, en reprenant l'exemple, la chaine contiendrait "'login'
'mylogin' 'mypassword'" et le vector contiendrait les chaines "login",
"mylogin" et "mypassword" ? Ca peut être interessant ! Y a t il une
fonction déjà toute faite pour rapidement ajouter des '\' ?

Je ne sais pas comment t'arrive les commandes, et je ne sais pas
si tu as autre chose à faire que de les transmettre.
Mais c'était en effet mon idée.

Quand à la 'fonction toute faite', non, je ne sais pas.
Peut-etre un usage détourne de accumulate. Sinon, une
bête boucle, une string et +=.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exiter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)
Back to top
Bloutiouf
Guest





PostPosted: Wed Mar 08, 2006 7:06 pm    Post subject: Re: Transmissions réseau Reply with quote

Autrement dit, en reprenant l'exemple, la chaine contiendrait "'login'
'mylogin' 'mypassword'" et le vector contiendrait les chaines "login",
"mylogin" et "mypassword" ? Ca peut être interessant ! Y a t il une
fonction déjà toute faite pour rapidement ajouter des '\' ?

Marc Boyer wrote:
Quote:
Non, sur fclc++, on met le tout à la réception dans un
std::vector<string> (ou std::dequeu<string>), et on fait un
accès par at ou [].
Il ne faut pas confondre le format de transfer réseau
et le format de manipulation.

Marc Boyer
Back to top
Arnaud Meurgues
Guest





PostPosted: Wed Mar 08, 2006 11:06 pm    Post subject: Re: Transmissions réseau Reply with quote

Bloutiouf wrote:

Quote:
les paramètres. J'ai fait un premier jet de mon travail, en séparant les
commandes par Â, les paramètres par Ê, etc. m'étant dit qu'en langue, on
ne met pas d'accent sur des majuscules

« en langue » ?

En français, en tout cas, ll faut accentuer les majuscules si l'on peut.
L'accent fait partie intégrante de l'orthographe d'un mot.

Quote:
caractères, au passage que j'interdis (je les transforme en A, E, etc).
Ca marche bien, les commandes sont donc du genre
"loginÊmyloginÊmypasswordÂ" (le  est à la fin pour vérifier qu'on a
bien dans le buffer la totalité de la commande).

Seulement, je me dis que c'est pas très professionnel, et qu'il devrait
bien exister des solutions (quant à ces  et tout).

Vous devriez regarder à « sérialisation ». Car finalement, il s'agit de
sérialiser un ensemble de chaînes de caractère. Il peut très bien y
avoir un format pour donner la longueur d'une chaîne (un entier puis
autant de caractères qu'indiqué par l'entier, par exemple).

--
Arnaud
Back to top
kanze
Guest





PostPosted: Thu Mar 09, 2006 10:06 am    Post subject: Re: Transmissions réseau Reply with quote

Bloutiouf wrote:
Quote:
François-Xavier GENDRIN wrote:
Pourquoi ne pas faire du XML ? Quitte à faire du texte ...

Oula ! Surcharge surcharge Wink c'est vrai que ca serait une
bonne solution, s'il ne fallait pas réduire presque au maximum
la taille de la chaine (ca occupe de la bande passante tout
ca).

Réduire au maximum, tu en es sûr ? Vue le coût déjà de IP et de
TCP, je ne crois pas que tu es à un octet près. (Ce qui ne veut
pas dire que XML est forcément un bon choix. Ce n'est pas parce
qu'on n'est pas à un octet près qu'il faut chercher à faire
compliquer quand on peut faire simple.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
kanze
Guest





PostPosted: Thu Mar 09, 2006 10:06 am    Post subject: Re: Transmissions réseau Reply with quote

Bloutiouf wrote:

Quote:
Je ne sais pas si je suis sur le bon groupe, mais je n'en
trouve pas de plus adaptés que celui-ci. Je développe une
petite application réseau (un serveur, chaque client se
connecte dessus) mais j'ai un doute.

Globalement, ce sont des chaines qui sont envoyées par socket
et mises dans un buffer. Ces chaines contiennent logiquement
une commande et tous les paramètres. J'ai fait un premier jet
de mon travail, en séparant les commandes par Â, les
paramètres par Ê, etc. m'étant dit qu'en langue, on ne met pas
d'accent sur des majuscules

En quelle langue. En français, il est généralement considéré
préférable de les mettre -- on pourrait même dire que ne pas les
mettre est une faute d'orthographe.

Quote:
donc qu'on utiliserait pas ces caractères, au passage que
j'interdis (je les transforme en A, E, etc). Ca marche bien,
les commandes sont donc du genre "loginÊmyloginÊmypasswordÂ"
(le  est à la fin pour vérifier qu'on a bien dans le buffer
la totalité de la commande).

Seulement, je me dis que c'est pas très professionnel, et
qu'il devrait bien exister des solutions (quant à ces  et
tout). Les recherches sur google ne sont capables que de me
dire comment sont connectés les clients...

En gros, il faut que tu définisses un protocol. Qui peut être
basé sur texte, ou binaire. Les protocols basés sur texte sont
les plus facile à debogguer -- un tel protocol est, grosso modo,
un petit langage. Si on se base sur Internet ASCII, par exemple,
chaque message commencera par un en-tête, suivi éventuellement
d'un bloc de données. Voir SMTP, par exemple, ou HTTP -- ton
protocol pourrait très bien se modéler sur HTTP, j'imagine --
pour la commande LOGIN, par exemple, on aurait :
LOGIN
user: toto
password: titi
...
le tout qui se termine par une ligne vide.

Les protocols binaires sont nettement plus difficile à mettre au
point. A priori, j'imagine qu'il y aurait une en-tête de block
commune à toutes les commands, avec entre autres informations la
commande même (encodée sur un entier, avec des valeurs
enumérées). Ensuite, les données propre à la commande, avec une
structure propre pour chaque commande.

La façon « classique » d'encoder une chaîne dans un protocol
binaire, c'est d'en envoyer la longueur sur un entier, suivi des
caractères. Suivi éventuellement des caractères de rembourrage
pour assurer l'alignement des données suivantes. (Pour des
raisons historiques, beaucoup de protocols binaires démandent
que tous les champs commencent à un offset multiple de quatre.)
Donc, XDR envoie le nombre de caractères sur quatres octets,
octet de poid fort d'abord, suivi des n caractères, suivi de 0 à
3 octets à 0, de façon à ce que le nombre total d'octets envoyé
soit un multiple de 4. BER enverra un 0x14 pour dire qu'il
s'agit d'une chaîne de caractères à huit bits, suivi de la
longueur de la chaîne sur un octet, si c'est moins de 128, ou
sur 2 à 128 octets, si c'est plus longue, suivi des caractères
même.

Quote:
Je m'adresse à toute personne ayant déjà fait une telle
application, évidemment celles qui ont des idées aussi :p ,
pour me dire comment elles ont fait / auraient fait. Merci
beaucoup.

Il n'y a pas de règle générale -- tout dépend de ce que fait le
serveur, les données à transférer, etc.

Dans le cas des protocols binaires un peu complexe, il est usual
d'utiliser des générateurs de code pour les données qui
transitent sur le liaison.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
kanze
Guest





PostPosted: Thu Mar 09, 2006 10:06 am    Post subject: Re: Transmissions réseau Reply with quote

BOUCNIAUX Benjamin wrote:
Quote:
Le Wed, 08 Mar 2006 14:44:21 +0100, Bloutiouf a écrit :

Je ne sais pas si je suis sur le bon groupe, mais je n'en
trouve pas de plus adaptés que celui-ci. Je développe une
petite application réseau (un serveur, chaque client se
connecte dessus) mais j'ai un doute.

Globalement, ce sont des chaines qui sont envoyées par
socket et mises dans un buffer. Ces chaines contiennent
logiquement une commande et tous les paramètres. J'ai fait
un premier jet de mon travail, en séparant les commandes par
Â, les paramètres par Ê, etc. m'étant dit qu'en langue, on
ne met pas d'accent sur des majuscules donc qu'on
utiliserait pas ces caractères, au passage que j'interdis
(je les transforme en A, E, etc). Ca marche bien, les
commandes sont donc du genre "loginÊmyloginÊmypasswordÂ" (le
 est à la fin pour vérifier qu'on a bien dans le buffer la
totalité de la commande).

Seulement, je me dis que c'est pas très professionnel, et
qu'il devrait bien exister des solutions (quant à ces  et
tout). Les recherches sur google ne sont capables que de me
dire comment sont connectés les clients...

Je m'adresse à toute personne ayant déjà fait une telle
application, évidemment celles qui ont des idées aussi :p ,
pour me dire comment elles ont fait / auraient fait. Merci
beaucoup.

Je vais dire ca comme ca, mais ne pourrais tu pas 'structurer'
tes commandes (en gros définir ce qu'elles vont contenir, de
manière à pouvoir les typer).
Ensuite, tu les envoies sur le réseau, tu les receptionnes
dans un buffer ayant la meme structure, et tu peux ensuite
récupérer les champs nécessaires.

D'accord, mais tu ne dis pas comment, et c'est ça, sa question.
Simplement écrire une struct C/C++ au moyen de ostream::write,
et s'attendre à pouvoir le lire de l'autre bout, ne marche pas.
Alors, qu'en faire.

Quote:
Cela dit, il faudrait que tu connaisses le format de tes
commandes, le nombre d'arguments à passer, etc etc...

Ça, de toute façon. (Mais j'ai l'impression qu'il en est
conscient, et qu'il a déjà fait cette partie du travail.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
kanze
Guest





PostPosted: Thu Mar 09, 2006 11:06 am    Post subject: Re: Transmissions réseau Reply with quote

Marc Boyer wrote:
Quote:
Le 08-03-2006, Bloutiouf <bloutiouf (AT) wanadoo (DOT) fr> a écrit :
Autrement dit, en reprenant l'exemple, la chaine
contiendrait "'login' 'mylogin' 'mypassword'" et le vector
contiendrait les chaines "login", "mylogin" et "mypassword"
? Ca peut être interessant ! Y a t il une fonction déjà
toute faite pour rapidement ajouter des '\' ?

Je ne sais pas comment t'arrive les commandes, et je ne sais
pas si tu as autre chose à faire que de les transmettre.

Mais c'était en effet mon idée.

Quand à la 'fonction toute faite', non, je ne sais pas.
Peut-etre un usage détourne de accumulate. Sinon, une bête
boucle, une string et +=.

J'en ai une, ou plutôt une classe (Gabi::ParsableString).
Ajouter, c'est assez simple, mais enlever à la reception, en
traitant tous les cas possible d'erreur, c'est autre chose.
J'accepte ' ou " comme délimiteur (mais les deux doivent être
identique) ; j'accepte aussi toutes les séquences d'échappement
habituelles : "\n" pour fin de ligne, etc. Aussi, dans le cas où
la chaîne ne contient que des alphanumériques, je me passe des
separateurs.

De la doc :

A wrapper for strings used for parsing input and formatting
output.

Unlike std::string itself, the output is guaranteed to be in
a format which can be recovered by input.

Like for char const* and std::string, >> inputs words, and
<< outputs words. In this case, however, the definition of
word is more complex; a word is either one or more
characters in the set [[:alnum:]_], or a quoted string,
delimited by either '\'' or '\"', and terminated by the
corresponding delimiter, an end of line or an end of file.
(Termination by either end of line or end of file is
considered to be a format error.) A quoted sequence may also
contain escaped characters: all of the usual C/C++ escape
sequences are permitted. (In particular, the only way a word
can contain a new line is by means of a '\n', '\u000A', or
-- not officially portable, but generally true -- a '\x0A'
or a '\012'.)

Mais je me démande dans quelle mesure c'est nécessaire. Est-ce
qu'il veut réelement permettre des blancs ou d'autres caractères
spéciaux dans le nom de l'utilisateur ou le mot de passe ?

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.