multicast – többes küldés

Kezdőlap Fórumok Programozás multicast – többes küldés

3 bejegyzés megtekintése - 1-3 / 3
  • Szerző
    Bejegyzés
  • #2067302
    tovis
    Felhasználó
      #2067303
      tovis
      Felhasználó

        Több éves(!) kinlódás után az „udpghost” levelezési listájában kaptam meg a választ.
        Szóval a multicast csoport csomag vétel így máködik:
        – létrehozzuk az UDP socket -et
        – bindelünk a „0.0.0.0:xxxxx” -as vagy a „*” címre
        – kitöltjók az mreq struktúrát (interfész cím – mondjuk 192.168.1.xxx és a kívánt csoport
          cím – mondjuk 224.0.0.xxx)
        – setsockopt – ADD_MEMBERSHIP
        és voila veszi a csomagokat. Ha megunjuk csak egy DROP_MEMBERSHIP kell. Ha kell egy másik csoport is (!) akkor arra is elvégezzükaz ADD_MEMBERSHIP műveletet.
        A win32 API -hoz képest annyi a különbség, hogy így tünik az interfész címre nem tudunk már bindelni – azaz a 192.168.1.xxx:xxxxx címre nem szabad/lehet bindelni! Vagyis ha egyszer egy socketre azt mondtuk hogy multicast csatornában megy akkor csak olyat tud!?
        Ha valaki tud valamit hozzá tenni szívesen hallanám.
        UI: két csoportra kipróbáltam – 224.0.0.10 és 224.0.0.20

        #1883881
        csaba
        Felhasználó

          Adva van egy lokális hálózat, mondjuk a 192.168.1.xxx cím kiosztással.
          Van egy szépenb mûködõ UDP socket modul, amely mondjuk azz adott gép (192.168.1.72) cím 8000 -es portjára van „bind” -elve. select() függvénnyel szépen ad/vesz. Be kellene iktatni, mondjuk a 224.0.0.10 -es multicast címrõl érkezõ csomagokat, amit az általam talált doksik szerint a setsockopt és ip_mreq struktúra segítségével a következõ képpen valósíthatunk meg:

          int                  so;
          struct ip_mreq  ma;
          inet_aton(„224.0.0.1”,&ma.imr_multiaddr);
          inet_aton(„192.168.1.72”,&ma.imr_interface);
          setsockopt(so,IPPROTO_IP,IP_ADD_MEMBERSHIP,&ma,sizeof(ma));

          Ennyi, így megadtuk a multicast -hoz használt interfészt és a kiválasztott multicast címet.
          Ha ez a kódrész lefut, a $netstat (most nem emlékszem pontosan milyen opcióval) az interfész mellé – mondjuk eth0 – kiteszi a „224.0.0.10” címet (elõtte csak a az eth0 224.0.0.1 volt).
          Mindezek ellenére nem veszi le a multicasst csatornában érkezõ csomagokat – tuti hogy jönnek!
          Eddig ezt a problémát úgy kerültem el, hogy eleve a multicast címre „bind” -eltem (úgy hogy a biztonság kedvéért megadtam melyik interfészre várom a multicast csomagokat a setsockopt IP_MULTICAST_IP opciójával).
          A dolog lényege az, hogy szeretném ki-be kapcsolni a multicast fogadást, anélkül, hogy a socketet bezárnám, így az adott 192.168.1.72 8000 porton a socketél csak hol leveszi a multicast csomagokat hol meg nem (IP_DROP_MEMBERSHIP opció).
          Mi kellhet még, semmilyen hibát nem ad vissza a program, a netstat azt mondja, hogy a multicast csatolás él, és még sem veszi a csomagokat, ami egy másik gépbõl folyamatosan dõlnek?

        3 bejegyzés megtekintése - 1-3 / 3
        • Be kell jelentkezni a hozzászóláshoz.