Muliticast w praktyce

  • Rejestracja: dni
  • Ostatnio: dni
0

Przeglądam artykuły na temat multicastu i wszystko wygląda ok jak się to czyta, ale jak to realizuje się w praktyce? Tzn mam ambitny plan napisać program który pobiera obraz z kamerki i wysyła go do niektórych ale określonych komputerów w sieci. Z ładnych obrazków na wikipedi wynika że musiałbym skorzystać z muliticastu i grup multicastowych, ale jak dobrać taki adres, jak przypisać komputer do takiej grupy?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Rozumiem że oczekujesz genialnego, uniwersalnego sposobu dla każdego możliwego języka? o_O Zasadniczo sprowadza sie to do utworzenia socketa i wywołania funkcji typu join_group().
Zasadniczo z multicastami jest taki problem że nie wszędzie routing multicastowy jest uruchomiony.

  • Rejestracja: dni
  • Ostatnio: dni
0

Nie nie chodzi mi o taki sposób. Nie kumam tylko jak to zrobić żeby z pośród komputerów A, B, C i D strumień z kamerki mogły odbierać komputery A, C i D a B już np nie? Mam im przypisać jeden adres multicastowy czy jak?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

To moze jednak doczytasz o tym jak działa taki routing? Zasadniczo wygląda to tak ze programowo dołączasz jaki komputer do grupy multicastowej a następnie w zależności od protokolu (PIM-DM lub PIM-SM) routery są o tym informowane. Następnie routery przekazują pakiety skierowane na taki grupowy adres (routery wiedzą kto zgłosił chęć przyjmowania tych pakietów).
Np. w Javie wygląda to tak:

Kopiuj
MulticastSocket socket = new MulticastSocket(9999);
socket.joinGroup(InetAddress.getByName("234.234.234.234"));

i voila, mamy socket który będzie odbierał pakiety wysłane na taki adres multicastowy.
W C robimy to np. tak:

Kopiuj
struct sockaddr_in addr;
struct ip_mreq mreq;
int sock = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(9999);
bind(sock, (struct sockaddr *) &addr, sizeof(addr));
mreq.imr_multiaddr.s_addr = inet_addr("234.234.234.234");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
  • Rejestracja: dni
  • Ostatnio: dni
0

Czyli ogólnie to kwestia odpowiedniego zaprogramowania tego a nie jakichś dodatkowych ustawień hostów. Trochę mi to rozjaśniło, dzięki.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Zasadniczo tak, o ile routery w sieci w której jesteś nie mają zablokowanego multicastu.

aurel
  • Rejestracja: dni
  • Ostatnio: dni
0

O, to ja jeszcze dopytam - czy znacie jakieś niskopoziomowe programy umożliwiające testowanie połączeń multicastowych?
A jeśli nie - programy, które korzystają z multicastów?
Chciałabym sobie na przykład uruchomić taki programik, a pod wiresharkiem pooglądać pakiety IGMP.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

@aurel a nie możesz po prostu takiego napisać? Zasadniczo uruchomienie multicastu to jest tyle ile napisałem powyzej, raptem kilka linijek. Do tego dodajesz tylko wysyłanie wiadomości (kolejne kilka linijek) i już sobie możesz coś testować.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.