/**
   * Connect the socket. Called by MIOPListener.
   *
   * @param profile
   * @param time_out unused, we use SO_TIMEOUT
   */
  @Override
  public void connect(Profile profile, long time_out) {
    if (!is_connected()) {
      if (profile instanceof MIOPProfile) {
        this.profile = (MIOPProfile) profile;
      } else {
        throw new org.omg.CORBA.BAD_PARAM(
            "attempt to connect an MIOP connection "
                + "to a non-MIOP profile: "
                + profile.getClass());
      }

      try {
        socket = new MulticastSocket(((MIOPProfile) profile).getUIPMCProfile().the_port);

        socket.setSoTimeout(socketTimeout);
        socket.setTimeToLive(timeToLive);
        socket.joinGroup(((MIOPProfile) profile).getGroupInetAddress());

        connection_info = socket.toString();
      } catch (Exception e) {
        if (socket != null) {
          socket.close();
        }
        throw new RuntimeException("Can't create multicast socket: " + profile);
      }

      connected = true;

      groupListener.start();
    }
  }
  /** Select IOP profile that matches protocol */
  public Profile selectProfile(List profiles, ClientConnectionManager ccm) {
    final Iterator iter = profiles.iterator();

    while (iter.hasNext()) {
      final Profile profile = (Profile) iter.next();
      final int profileTag = profile.tag();

      for (int i = 0; i < protocols.length; i++) {
        final int tagToMatch = protocols[i].protocol_type;

        if (profileTag == tagToMatch) {
          return profile;
        }

        if (profileTag == TAG_INTERNET_IOP.value && profile instanceof IIOPProfile) {
          // Special case check for IIOP profile supporting SSL
          IIOPProfile iiopProfile = (IIOPProfile) profile;
          if ((tagToMatch == ORBConstants.JAC_SSL_PROFILE_ID) && (iiopProfile.getSSL() != null)) {
            return profile;
          }

          // Special case check for IIOP profile not supporting SSL
          if ((tagToMatch == ORBConstants.JAC_NOSSL_PROFILE_ID)
              && ((iiopProfile.getSSL() == null)
                  ||
                  // SSL port contains a valid value but further check is required
                  // see if protection is enabled.
                  (((iiopProfile.getSSL()).target_requires & org.omg.Security.NoProtection.value)
                      != 0))) {
            return profile;
          }
        }
      }
    }

    return null;
  }