Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Is there some way to generate random Multicast address ?
Forum Updated to NodeBB v4.3 + New Features

Is there some way to generate random Multicast address ?

Scheduled Pinned Locked Moved General and Desktop
5 Posts 2 Posters 4.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    Anticross
    wrote on last edited by
    #1

    I write program which will stream audio to multicast group. I need to generate random multicast ip which is not reserved yet. I need something like chooseRandomIPv4SSMAddress function in live555 library. So it there any way to do this in qt ?

    1 Reply Last reply
    0
    • A Offline
      A Offline
      Anticross
      wrote on last edited by
      #2

      The realization of this function in live555 library is seems like this:
      @netAddressBits chooseRandomIPv4SSMAddress(UsageEnvironment& env) {
      // First, a hack to ensure that our random number generator is seeded:
      (void) ourIPAddress(env);

      // Choose a random address in the range [232.0.1.0, 232.255.255.255)
      // i.e., [0xE8000100, 0xE8FFFFFF)
      netAddressBits const first = 0xE8000100, lastPlus1 = 0xE8FFFFFF;
      netAddressBits const range = lastPlus1 - first;

      return ntohl(first + ((netAddressBits)our_random())%range);
      }@

      And:
      @netAddressBits ourIPAddress(UsageEnvironment& env) {
      static netAddressBits ourAddress = 0;
      int sock = -1;
      struct in_addr testAddr;

      if (ourAddress == 0) {
      // We need to find our source address
      struct sockaddr_in fromAddr;
      fromAddr.sin_addr.s_addr = 0;

      // Get our address by sending a (0-TTL) multicast packet,
      // receiving it, and looking at the source address used.
      // (This is kinda bogus, but it provides the best guarantee
      // that other nodes will think our address is the same as we do.)
      do {
        loopbackWorks = 0; // until we learn otherwise
      
        testAddr.s_addr = our_inet_addr("228.67.43.91"); // arbitrary
        Port testPort(15947); // ditto
      
        sock = setupDatagramSocket(env, testPort);
        if (sock < 0) break;
      
        if (!socketJoinGroup(env, sock, testAddr.s_addr)) break;
      
        unsigned char testString[] = "hostIdTest";
        unsigned testStringLength = sizeof testString;
      
        if (!writeSocket(env, sock, testAddr, testPort, 0,
           testString, testStringLength)) break;
      
        // Block until the socket is readable (with a 5-second timeout):
        fd_set rd_set;
        FD_ZERO(&rd_set);
        FD_SET((unsigned)sock, &rd_set);
        const unsigned numFds = sock+1;
        struct timeval timeout;
        timeout.tv_sec = 5;
        timeout.tv_usec = 0;
        int result = select(numFds, &rd_set, NULL, NULL, &timeout);
        if (result <= 0) break;
      
        unsigned char readBuffer[20];
        int bytesRead = readSocket(env, sock,
       readBuffer, sizeof readBuffer,
       fromAddr);
        if (bytesRead != (int)testStringLength
      

      || strncmp((char*)readBuffer, (char*)testString, testStringLength) != 0) {
      break;
      }

        loopbackWorks = 1;
      } while (0);
      
      if (sock >= 0) {
        socketLeaveGroup(env, sock, testAddr.s_addr);
        closeSocket(sock);
      }
      
      if (!loopbackWorks) do {
        // We couldn't find our address using multicast loopback,
        // so try instead to look it up directly - by first getting our host name, and then resolving this host name
        char hostname[100];
        hostname[0] = '\0';
        int result = gethostname(hostname, sizeof hostname);
        if (result != 0 || hostname[0] == '\0') {
      

      env.setResultErrMsg("initial gethostname() failed");
      break;
      }

        // Try to resolve "hostname" to an IP address:
        NetAddressList addresses(hostname);
        NetAddressList::Iterator iter(addresses);
        NetAddress const* address;
      
        // Take the first address that's not bad:
        netAddressBits addr = 0;
        while ((address = iter.nextAddress()) != NULL) {
      

      netAddressBits a = (netAddressBits)(address->data());
      if (!badAddressForUs(a)) {
      addr = a;
      break;
      }
      }

        // Assign the address that we found to "fromAddr" (as if the 'loopback' method had worked), to simplify the code below: 
        fromAddr.sin_addr.s_addr = addr;
      } while (0);
      
      // Make sure we have a good address:
      netAddressBits from = fromAddr.sin_addr.s_addr;
      if (badAddressForUs(from)) {
        char tmp[100];
        sprintf(tmp, "This computer has an invalid IP address: %s", AddressString(from).val());
        env.setResultMsg(tmp);
        from = 0;
      }
      
      ourAddress = from;
      
      // Use our newly-discovered IP address, and the current time,
      // to initialize the random number generator's seed:
      struct timeval timeNow;
      gettimeofday(&timeNow, NULL);
      unsigned seed = ourAddress^timeNow.tv_sec^timeNow.tv_usec;
      our_srandom(seed);
      

      }
      return ourAddress;
      }@

      1 Reply Last reply
      0
      • A Offline
        A Offline
        Anticross
        wrote on last edited by
        #3

        So is there any solution on Qt ?

        1 Reply Last reply
        0
        • A Offline
          A Offline
          Anticross
          wrote on last edited by
          #4

          How can I check if multicast group exist or not ? If I have it's ip ?

          1 Reply Last reply
          0
          • M Offline
            M Offline
            maxim.prishchepa
            wrote on last edited by
            #5

            I need to solve similar issue, some one know how to check is multicast group exists?

            Programming Is Like Sex: One mistake and you have to support it for the rest of your life. (Michael Sinz).

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved