Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Is there some way to generate random Multicast address ?



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



  • 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;
    }@



  • So is there any solution on Qt ?



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



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


Log in to reply