Je cherche à émettre des données (une chaîne de 30 caractères) en
broadcast UDP. Si je sais me débrouiller pour les socket TCP (et encore
je n'ai pas tenté le broadcast), pour les sockets UDP j'ai du mal à voir
comment configurer la socket afin de pouvoir écrire à partir d'une
machine et lire à partir de plusieurs autres.
Jusque-là, pour mes serveurs, je faisais la recette habituelle :
- pour les serveurs :
socket()
setsockopt() pour REUSEADDR et LINGER
bind()
listen()
- pour les clients :
socket()
setsockopt() (idem)
bind()
connect()
Or pour les sockets UDP en broadcast, je ne vois pas trop comment
faire. Pour l'instant (ce qui ne marche pas) :
socket()
setsockopt() pour REUSEADDR et BROADCAST
connect()
Puis write() ou send() pour écrire et read() ou recv() pour lire.
Quelqu'un a-t-il une idée sur la méthode à appliquer ?
Merci d'avance.
Oui. Ceci dit c'est fait pour tourner sur un LAN non connecté et non accessible par les non-autorisés :) Donc niveau sécurité, c'est pas un souci...
Ne jamais négliger les petites améliorations de sécurité sous ce prétexte.
Mouais, mais comme je le dis dans un autre post, ce n'est qu'un programme de démo (du moins le récepteur).
M'enfin bon, cela voudrait-il dire que pour balancer en permanence des données sur le port X en broadcast (192.168.0.255), il faille que je bind() la socket sur une adresse locale autre que celle du broadcast ?
Bon, apparemment, tu as des lacunes en réseau, on va reprendre doucement.
Hum...
[snip je suis au courant]
Enfin, en broadcast (non connecté, forcément) : ici, on a une seule socket A, mais plusieurs socket B1, B2, etc.. Les paquets envoyés par A ont toujours pour source IPa et Pa, ça ne change pas.
Ok, c'est donc pour ça que bind() n'était pas nécessaire sur l'émetteur.
Une alternative serait d'avoir Pa=Pb,
Ce serait sympa.
Côté B :
- création de la socket ; - bind sur le port où les gens sont censés écouter ;
Donc avec l'adresse locale. Je suppose que c'est simplement à la création de la socket avec SO_BROADCAST que l'on dit vouloir recevoir du broadcast et qu'ensuite c'est le mécanisme de transport qui transmet tous les paquets en broadcast à toutes les machines...
- recvfrom ; - vérification que l'adresse source est bien celle du serveur autorisé, et
On ne connaît pas à l'avance quelle sera l'adresse du serveur.
Thomas.
Nicolas George a tapoté :
Thomas Nemeth wrote in message <d8um07$kcc$3@s1.news.oleane.net>:
Oui. Ceci dit c'est fait pour tourner sur un LAN non connecté et non
accessible par les non-autorisés :) Donc niveau sécurité, c'est pas
un souci...
Ne jamais négliger les petites améliorations de sécurité sous ce prétexte.
Mouais, mais comme je le dis dans un autre post, ce n'est qu'un
programme de démo (du moins le récepteur).
M'enfin bon, cela voudrait-il dire que pour balancer en permanence
des données sur le port X en broadcast (192.168.0.255), il faille que
je bind() la socket sur une adresse locale autre que celle du
broadcast ?
Bon, apparemment, tu as des lacunes en réseau, on va reprendre doucement.
Hum...
[snip je suis au courant]
Enfin, en broadcast (non connecté, forcément) : ici, on a une seule socket
A, mais plusieurs socket B1, B2, etc.. Les paquets envoyés par A ont
toujours pour source IPa et Pa, ça ne change pas.
Ok, c'est donc pour ça que bind() n'était pas nécessaire sur l'émetteur.
Une alternative serait d'avoir Pa=Pb,
Ce serait sympa.
Côté B :
- création de la socket ;
- bind sur le port où les gens sont censés écouter ;
Donc avec l'adresse locale. Je suppose que c'est simplement à la
création de la socket avec SO_BROADCAST que l'on dit vouloir recevoir
du broadcast et qu'ensuite c'est le mécanisme de transport qui transmet
tous les paquets en broadcast à toutes les machines...
- recvfrom ;
- vérification que l'adresse source est bien celle du serveur autorisé, et
On ne connaît pas à l'avance quelle sera l'adresse du serveur.
Oui. Ceci dit c'est fait pour tourner sur un LAN non connecté et non accessible par les non-autorisés :) Donc niveau sécurité, c'est pas un souci...
Ne jamais négliger les petites améliorations de sécurité sous ce prétexte.
Mouais, mais comme je le dis dans un autre post, ce n'est qu'un programme de démo (du moins le récepteur).
M'enfin bon, cela voudrait-il dire que pour balancer en permanence des données sur le port X en broadcast (192.168.0.255), il faille que je bind() la socket sur une adresse locale autre que celle du broadcast ?
Bon, apparemment, tu as des lacunes en réseau, on va reprendre doucement.
Hum...
[snip je suis au courant]
Enfin, en broadcast (non connecté, forcément) : ici, on a une seule socket A, mais plusieurs socket B1, B2, etc.. Les paquets envoyés par A ont toujours pour source IPa et Pa, ça ne change pas.
Ok, c'est donc pour ça que bind() n'était pas nécessaire sur l'émetteur.
Une alternative serait d'avoir Pa=Pb,
Ce serait sympa.
Côté B :
- création de la socket ; - bind sur le port où les gens sont censés écouter ;
Donc avec l'adresse locale. Je suppose que c'est simplement à la création de la socket avec SO_BROADCAST que l'on dit vouloir recevoir du broadcast et qu'ensuite c'est le mécanisme de transport qui transmet tous les paquets en broadcast à toutes les machines...
- recvfrom ; - vérification que l'adresse source est bien celle du serveur autorisé, et
On ne connaît pas à l'avance quelle sera l'adresse du serveur.
Thomas.
Nicolas George
Thomas Nemeth wrote in message <d8up8v$n65$:
Ok, c'est donc pour ça que bind() n'était pas nécessaire sur l'émetteur.
Oui.
Une alternative serait d'avoir Pa=Pb, Ce serait sympa.
Ça peut être utile pour certains protocoles.
Donc avec l'adresse locale.
Là, typiquement, un INADDR_ANY ne ferait pas de mal.
Je suppose que c'est simplement à la création de la socket avec SO_BROADCAST que l'on dit vouloir recevoir du broadcast et qu'ensuite c'est le mécanisme de transport qui transmet tous les paquets en broadcast à toutes les machines...
Oui, c'est ça.
On ne connaît pas à l'avance quelle sera l'adresse du serveur.
Vérifier quand même que l'adresse est dans une plage autorisée, si on la connaît, peut quand même être une bonne idée.
Thomas Nemeth wrote in message <d8up8v$n65$3@s1.news.oleane.net>:
Ok, c'est donc pour ça que bind() n'était pas nécessaire sur l'émetteur.
Oui.
Une alternative serait d'avoir Pa=Pb,
Ce serait sympa.
Ça peut être utile pour certains protocoles.
Donc avec l'adresse locale.
Là, typiquement, un INADDR_ANY ne ferait pas de mal.
Je suppose que c'est simplement à la
création de la socket avec SO_BROADCAST que l'on dit vouloir recevoir
du broadcast et qu'ensuite c'est le mécanisme de transport qui transmet
tous les paquets en broadcast à toutes les machines...
Oui, c'est ça.
On ne connaît pas à l'avance quelle sera l'adresse du serveur.
Vérifier quand même que l'adresse est dans une plage autorisée, si on la
connaît, peut quand même être une bonne idée.
Ok, c'est donc pour ça que bind() n'était pas nécessaire sur l'émetteur.
Oui.
Une alternative serait d'avoir Pa=Pb, Ce serait sympa.
Ça peut être utile pour certains protocoles.
Donc avec l'adresse locale.
Là, typiquement, un INADDR_ANY ne ferait pas de mal.
Je suppose que c'est simplement à la création de la socket avec SO_BROADCAST que l'on dit vouloir recevoir du broadcast et qu'ensuite c'est le mécanisme de transport qui transmet tous les paquets en broadcast à toutes les machines...
Oui, c'est ça.
On ne connaît pas à l'avance quelle sera l'adresse du serveur.
Vérifier quand même que l'adresse est dans une plage autorisée, si on la connaît, peut quand même être une bonne idée.
Thomas Nemeth
Nicolas George a tapoté :
Thomas Nemeth wrote in message <d8up8v$n65$:
Une alternative serait d'avoir Pa=Pb, Ce serait sympa.
Ça peut être utile pour certains protocoles.
Par exemple ?
Donc avec l'adresse locale.
Là, typiquement, un INADDR_ANY ne ferait pas de mal.
Oui, c'est ce que j'ai trouvé en farfouillant mes exemples de code.
On ne connaît pas à l'avance quelle sera l'adresse du serveur.
Vérifier quand même que l'adresse est dans une plage autorisée, si on la connaît, peut quand même être une bonne idée.
Hum... Il est possible que, suivant la configuration finale, on connaisse l'IP (du moins sur le serveur, les autres machines ne sont en aucune manière supposée la connaître). J'aurais tout de même préféré avoir un moyen de la connaître automatiquement.
Merci pour tout.
Thomas.
Nicolas George a tapoté :
Thomas Nemeth wrote in message <d8up8v$n65$3@s1.news.oleane.net>:
Une alternative serait d'avoir Pa=Pb,
Ce serait sympa.
Ça peut être utile pour certains protocoles.
Par exemple ?
Donc avec l'adresse locale.
Là, typiquement, un INADDR_ANY ne ferait pas de mal.
Oui, c'est ce que j'ai trouvé en farfouillant mes exemples de code.
On ne connaît pas à l'avance quelle sera l'adresse du serveur.
Vérifier quand même que l'adresse est dans une plage autorisée, si on la
connaît, peut quand même être une bonne idée.
Hum... Il est possible que, suivant la configuration finale, on
connaisse l'IP (du moins sur le serveur, les autres machines ne
sont en aucune manière supposée la connaître). J'aurais tout de
même préféré avoir un moyen de la connaître automatiquement.
Une alternative serait d'avoir Pa=Pb, Ce serait sympa.
Ça peut être utile pour certains protocoles.
Par exemple ?
Donc avec l'adresse locale.
Là, typiquement, un INADDR_ANY ne ferait pas de mal.
Oui, c'est ce que j'ai trouvé en farfouillant mes exemples de code.
On ne connaît pas à l'avance quelle sera l'adresse du serveur.
Vérifier quand même que l'adresse est dans une plage autorisée, si on la connaît, peut quand même être une bonne idée.
Hum... Il est possible que, suivant la configuration finale, on connaisse l'IP (du moins sur le serveur, les autres machines ne sont en aucune manière supposée la connaître). J'aurais tout de même préféré avoir un moyen de la connaître automatiquement.
Merci pour tout.
Thomas.
Laurent Wacrenier
Thomas Nemeth écrit:
Utiliser 255.255.255.255 comme adresse broadcast x.sin_addr.s_addr = htonl(INADDR_BROADCAST);
255.255.255.255 ?
C'est l'adresse de broadcast de tout le monde.
Pourquoi interroger le DNS ?
Parceque c'est la seule manière que je connaisse de récupérer l'adresse IP de la machine pour le moment (sans réfléchir ni chercher) :)
Ça ne sert à rien pour remplir un sockaddr_in, il suffit de mettre htonl(INADDR_ANY) (c'est à dire 0)
Thomas Nemeth <thomas.nemeth@betatech.invalid> écrit:
Utiliser 255.255.255.255 comme adresse broadcast
x.sin_addr.s_addr = htonl(INADDR_BROADCAST);
255.255.255.255 ?
C'est l'adresse de broadcast de tout le monde.
Pourquoi interroger le DNS ?
Parceque c'est la seule manière que je connaisse de récupérer l'adresse
IP de la machine pour le moment (sans réfléchir ni chercher) :)
Ça ne sert à rien pour remplir un sockaddr_in, il suffit de mettre
htonl(INADDR_ANY) (c'est à dire 0)
expression régulière/rationnelle en théorie de l'info.
Ah ? Et c'est quoi la différence ?
Expression rationelle est le terme français, Expression régulière la traduiction mot à mot du terme anglais.
tmartin
Laurent Wacrenier wrote in message :
Thierry Martinez écrit:
Marc Boyer wrote in message :
expression régulière/rationnelle en théorie de l'info.
Ah ? Et c'est quoi la différence ?
Expression rationelle est le terme français, Expression régulière la traduiction mot à mot du terme anglais.
Les deux termes se différencient donc par l'habitude et/ou la qualité de la traduction. Mais les deux termes désignent exactement la même chose il me semble !
Laurent Wacrenier wrote in message
<slrndbboda.2lr6.lwa@victor.teaser.fr>:
Thierry Martinez <tmartin@clipper.ens.fr> écrit:
Marc Boyer wrote in message
<slrndb554o.mdo.Marc.Boyer@localhost.localdomain>:
expression régulière/rationnelle en théorie de l'info.
Ah ? Et c'est quoi la différence ?
Expression rationelle est le terme français, Expression régulière
la traduiction mot à mot du terme anglais.
Les deux termes se différencient donc par l'habitude et/ou la qualité de
la traduction. Mais les deux termes désignent exactement la même chose
il me semble !
expression régulière/rationnelle en théorie de l'info.
Ah ? Et c'est quoi la différence ?
Expression rationelle est le terme français, Expression régulière la traduiction mot à mot du terme anglais.
Les deux termes se différencient donc par l'habitude et/ou la qualité de la traduction. Mais les deux termes désignent exactement la même chose il me semble !
Jacques L'helgoualc'h
Le 20-06-2005, Thierry Martinez a écrit :
Laurent Wacrenier wrote in message [...]
Expression rationelle est le terme français, Expression régulière la traduiction mot à mot du terme anglais.
La notion de « regular expression » remontant à Stephen C. Kleene, la traduction par « régulière » n'est pas fautive, même si « rationnelle » est employée dans le contexte universitaire de la théorie des langages.
Les deux termes se différencient donc par l'habitude et/ou la qualité de la traduction. Mais les deux termes désignent exactement la même chose il me semble !
Une expression rationnelle peut aussi, en algèbre ordinaire, désigner autre chose ... qu'on retrouvera dans tous les premiers résultats d'une recherche google « "rational expression" site:edu ».
Cf. aussi http://webperso.easyconnect.fr/bdesgraupes/Books/introRGX.html -- Jacques L'helgoualc'h
Le 20-06-2005, Thierry Martinez <tmartin@clipper.ens.fr> a écrit :
Laurent Wacrenier wrote in message
[...]
Expression rationelle est le terme français, Expression régulière
la traduiction mot à mot du terme anglais.
La notion de « regular expression » remontant à Stephen C. Kleene, la
traduction par « régulière » n'est pas fautive, même si « rationnelle »
est employée dans le contexte universitaire de la théorie des langages.
Les deux termes se différencient donc par l'habitude et/ou la qualité
de la traduction. Mais les deux termes désignent exactement la même
chose il me semble !
Une expression rationnelle peut aussi, en algèbre ordinaire, désigner
autre chose ... qu'on retrouvera dans tous les premiers résultats d'une
recherche google « "rational expression" site:edu ».
Cf. aussi http://webperso.easyconnect.fr/bdesgraupes/Books/introRGX.html
--
Jacques L'helgoualc'h
Expression rationelle est le terme français, Expression régulière la traduiction mot à mot du terme anglais.
La notion de « regular expression » remontant à Stephen C. Kleene, la traduction par « régulière » n'est pas fautive, même si « rationnelle » est employée dans le contexte universitaire de la théorie des langages.
Les deux termes se différencient donc par l'habitude et/ou la qualité de la traduction. Mais les deux termes désignent exactement la même chose il me semble !
Une expression rationnelle peut aussi, en algèbre ordinaire, désigner autre chose ... qu'on retrouvera dans tous les premiers résultats d'une recherche google « "rational expression" site:edu ».
Cf. aussi http://webperso.easyconnect.fr/bdesgraupes/Books/introRGX.html -- Jacques L'helgoualc'h
Marc Boyer
Thierry Martinez a écrit :
Marc Boyer wrote in message :
expression régulière/rationnelle en théorie de l'info.
Ah ? Et c'est quoi la différence ?
Langage rationnel: reconnu par un automate finit Par extention, une expression rationnelle est une expression qui désigne un langage rationnel. Expression régulière, ça devient plus flou (voir les pages de man des sed/grep/awk, on voit des basiques, des extended, etc.). Si on se prend les simples opérateurs concaténation/choix/itération, c'est pareil, et on montre l'égalité.
Si on s'autorise d'autres opérateurs, ça devient chaud.
Exemple perl (syntaxe approx): (a*)b1 reconnait a^n.b.a^n qui n'est pas rationnel.
Donc en fait, une expression rationnelle en fait, je sais bien ce que c'est. Régulier, c'est nettement moins clair.
Marc Boyer -- À vélo, prendre une rue à contre-sens est moins dangeureux que prendre un boulevard dans le sens légal. À qui la faute ?
Thierry Martinez <tmartin@clipper.ens.fr> a écrit :
Marc Boyer wrote in message
<slrndb554o.mdo.Marc.Boyer@localhost.localdomain>:
expression régulière/rationnelle en théorie de l'info.
Ah ? Et c'est quoi la différence ?
Langage rationnel: reconnu par un automate finit
Par extention, une expression rationnelle est une
expression qui désigne un langage rationnel.
Expression régulière, ça devient plus flou (voir
les pages de man des sed/grep/awk, on voit des
basiques, des extended, etc.).
Si on se prend les simples opérateurs
concaténation/choix/itération, c'est pareil, et on
montre l'égalité.
Si on s'autorise d'autres opérateurs, ça devient
chaud.
Exemple perl (syntaxe approx):
(a*)b1
reconnait
a^n.b.a^n
qui n'est pas rationnel.
Donc en fait, une expression rationnelle en fait, je
sais bien ce que c'est. Régulier, c'est nettement moins
clair.
Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?
expression régulière/rationnelle en théorie de l'info.
Ah ? Et c'est quoi la différence ?
Langage rationnel: reconnu par un automate finit Par extention, une expression rationnelle est une expression qui désigne un langage rationnel. Expression régulière, ça devient plus flou (voir les pages de man des sed/grep/awk, on voit des basiques, des extended, etc.). Si on se prend les simples opérateurs concaténation/choix/itération, c'est pareil, et on montre l'égalité.
Si on s'autorise d'autres opérateurs, ça devient chaud.
Exemple perl (syntaxe approx): (a*)b1 reconnait a^n.b.a^n qui n'est pas rationnel.
Donc en fait, une expression rationnelle en fait, je sais bien ce que c'est. Régulier, c'est nettement moins clair.
Marc Boyer -- À vélo, prendre une rue à contre-sens est moins dangeureux que prendre un boulevard dans le sens légal. À qui la faute ?