OVH Cloud OVH Cloud

Socket UDP en broadcast

83 réponses
Avatar
Thomas Nemeth
Bonjour !

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.

Thomas.

10 réponses

5 6 7 8 9
Avatar
Thomas Nemeth
Nicolas George a tapoté :

Thomas Nemeth wrote in message <d8um07$kcc$:
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.


Avatar
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.


Avatar
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.



Avatar
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)


Avatar
Laurent Wacrenier
Thomas Nemeth écrit:
Mouais, mais comme je le dis dans un autre post, ce n'est qu'un
programme de démo (du moins le récepteur).


Le problème, c'est que celui qui va écrire le vrai va probablement
faire du copier/coller.

- 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.


On peut vouloir vérifier qu'elle ne change pas.


Avatar
tmartin
Marc Boyer wrote in message
:
expression régulière/rationnelle en théorie de l'info.


Ah ? Et c'est quoi la différence ?

Avatar
Laurent Wacrenier
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.


Avatar
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 !



Avatar
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


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


5 6 7 8 9