Multicast
#1
Inviato 22 giugno 2011 - 08:02
#2
Inviato 22 giugno 2011 - 08:38
#3
Inviato 22 giugno 2011 - 08:40
#4
Inviato 22 giugno 2011 - 09:01
Se apro 2 applicazioni su 2 PC sulla porta 4000 che comunicano su 225.0.0.1, tutto funziona a meraviglia.
Se provo a fare un JoinMulticastGroup 225.0.0.2 porta 5000 non va niente perché, pare, se apri le applicazioni sulla porta 4000, quella puoi usare e basta.
Siccome ci servono più applicazioni sullo stesso PC, mi tocca aprirle tutte sulla porta 4000 e non ci riesco perché la porta, una volta aperta la prima applicazione, è busy.
Quindi: come cacchio faccio ad aprire più applicazioni che usano la stessa porta ?
ho già provato la socket option SO_REUSEADDRESS ma nada.
#5
Inviato 22 giugno 2011 - 09:10
SO_REUSEADDR e SO_REUSEPORT non fanno quello che ti aspetti.
Edito per chiarezza:
1. SO_REUSEPORT non c'è sotto linux, solo sotto *BSD, quindi non so se ti interessa.
2. SO_REUSEADDR ti permette di bindarti() ad un indirizzo/porta già bindato, SE questo è in TIME_WAIT. Se è in altro stato ti viene restituito un errore. Non c'è nulla di "contemporaneo", IIRC la vecchia applicazione che era in bind() sul socket viene "sbindata".
#6
Inviato 22 giugno 2011 - 09:23
AFAIK non puoi, a meno di non usare un qualche "middleware" tra le tue applicazioni e la porta in questione (ed avere un modo per "distinguere" cosa va ad una e cosa all'altra). La bind() è il punto chiave della questione, se la usi (e DEVI), non puoi più usare la porta con un'altra applicazione.
SO_REUSEADDR e SO_REUSEPORT non fanno quello che ti aspetti.
Grazie.
Ma quello che non capisco è perché non posso fare un join multicast address su una porta diversa. Cioè, posso usare UNA sola porta ???
#7
Inviato 22 giugno 2011 - 09:31
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true));
#8
Inviato 22 giugno 2011 - 09:41
Ma quello che non capisco è perché non posso fare un join multicast address su una porta diversa. Cioè, posso usare UNA sola porta ???
Mi pare che anche il multicast (UDP) necessiti di una dest port, o sbaglio?
Non prendermi sul serio, dovrei recuperare il manuale di reti e darci un occhio, ma ora sono in ufficio
#9
Inviato 22 giugno 2011 - 09:47
Mi pare che anche il multicast (UDP) necessiti di una dest port, o sbaglio?
Non prendermi sul serio, dovrei recuperare il manuale di reti e darci un occhio, ma ora sono in ufficio [/quote]
Allora, ho compilato il boost sender
http://www.boost.org... ... sender.cpp
e il boost receiver
http://www.boost.org... ... ceiver.cpp
Poi ho lanciato 2 clients e un server e funziona tutto like a charm!
Ora mi preparo ad entrare nel code dei boost guys, se non mi vedete nelle prossime 4-5 ore, venitemi cercare in qualche header file
#10
Inviato 22 giugno 2011 - 09:48
#11
Inviato 22 giugno 2011 - 09:52
Eppure qui http://www.boost.org... ... ceiver.cpp vedo:
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true));
Perchè non sono un esperto di multicast. Mi dicono dalla scrivania dietro la mia che in multicast il kernel dovrebbe consegnare il messaggio a tutti i processi in ascolto. Però devi mettere il setsockopt() con il SO_REUSEADDR prima della bind().
Se non ti funziona è perchè ricordo bene e SO_REUSADDR sotto linux è broken.
#12
Inviato 22 giugno 2011 - 09:55
Però vedo che i boost guys usano anche SO_BROADCAST.
#13
Inviato 22 giugno 2011 - 10:02
Ieri ho visto che SO_REUSEPORT è deprecated su Linux, non SO_REUSEADDR.
MI confondo sempre tra *BSD e linux, troppo abituato ad usare il primo.
Quelli di Linux hanno deprecato SO_REUSEPORT perchè era solo un modo di girare intorno ad alcune limitazioni di SO_REUSEADDR, che ora sotto linux non ci sono più.
#14
Inviato 22 giugno 2011 - 10:04
MI confondo sempre tra *BSD e linux, troppo abituato ad usare il primo.
Quelli di Linux hanno deprecato SO_REUSEPORT perchè era solo un modo di girare intorno ad alcune limitazioni di SO_REUSEADDR, che ora sotto linux non ci sono più.[/quote]
Ah ecco.
Comunque non ne vengo fuori... devo solo controllare questa manciata di files
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#15
Inviato 22 giugno 2011 - 10:04
Già fatto sto test?
#16
Inviato 22 giugno 2011 - 10:13
No, ma mi sa che mi sono confuso su sto SO_BROADCAST, non so se veramente lo usano sti stronzi.Prova ad usare SO_REUSEADDR e SO_BROADCAST.
Già fatto sto test?
In pratica devo capire cosa fanno qui:
boost::asio::ip::udp::endpoint listen_endpoint(listen_address, multicast_port); socket_.open(listen_endpoint.protocol()); socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); socket_.bind(listen_endpoint); // Join the multicast group. socket_.set_option(boost::asio::ip::multicast::join_group(multicast_address));
#17
Inviato 22 giugno 2011 - 10:39
Datagrams to broadcast addresses can be only sent or received when the SO_BROADCAST socket flag is set. In the current implementation connection oriented sockets are only allowed to use unicast addresses.
A me sa proprio che lo usano, almeno stando a man 7 ip
#18
Inviato 22 giugno 2011 - 10:45
Si ma broadcast <> multicast.Datagrams to broadcast addresses can be only sent or received when the SO_BROADCAST socket flag is set. In the current implementation connection oriented sockets are only allowed to use unicast addresses.
A me sa proprio che lo usano, almeno stando a man 7 ip
Comunque ora ci si mette anche Abbraccianigga OS, diolinux
./jackd -d alsa -r48000 -p1024 -S -n3
the playback device "hw:0" is already in use. Please stop the application using it and run JACK again
NON C'È NIENTE CHE USA LA hw:0! HO KILLATO TUTTO
#19
Inviato 22 giugno 2011 - 10:47
#20
Inviato 22 giugno 2011 - 10:56
Si ma broadcast <> multicast.
My fault, sto fondendo a causa di file system che esplodono e alert che suonano come battone.
E quelle puttane degli sviluppatori chiedono pure i log!