2010-09-05 8 views
6

J'ai besoin de quelque chose comme la fonction C getservbyname() pour une application Java. Je dois analyser un fichier de configuration qui peut contenir un numéro de port ou le nom du service, et dans ce dernier cas, je dois le convertir en numéro de port pour le transmettre à une bibliothèque. J'ai trouvé this bug et j'étais un peu étonné que la question ait été posée en 1997 (!) Et qu'elle n'ait même pas été considérée pour une mise en œuvre pendant 13 ans. Je ne veux pas vraiment faire les analyses syntaxiques spécifiques à la plate-forme pour moi-même - y a-t-il un autre moyen?Obtenir le numéro de port pour le nom du service?

+0

Nice. Un drive-by down vote sans aucun commentaire. Très utile ... – vwegert

Répondre

1

En this question J'ai trouvé une bibliothèque here qui semble faire de son mieux pour fournir cette fonctionnalité multiplateforme.

+0

Merci pour l'indice .... Malheureusement, c'est une bibliothèque sous licence LGPL qui rend difficile l'utilisation de mon projet EPL. Et il utilise Maven et tire dans jruby et une autre dépendance étrange (jaffl) dont le site Web apparemment officiel http://kenai.com/projects/jaffl/ me dit que le projet n'existe pas .. – vwegert

2

La plupart des nouvelles fonctionnalités ajoutées à Java ont un cas d'utilisation éprouvé en tant que bibliothèque Java open source depuis un certain temps. par exemple. la bibliothèque de concurrence n'a été ajoutée qu'après avoir été une bibliothèque autonome pendant 6 ans. Les fermetures ne sont ajoutées que parce que la plupart des autres langages dynamiques l'ont maintenant. (Et très à contrecœur)

Je suis d'accord que vous pensez que cette fonction est disponible en Java sauf, je voudrais aussi, je pense que très peu de gens l'utilisent.

+0

La façon dont je le vois, permettant La mise en réseau TCP sans la résolution des noms de service aux numéros de port est comme permettre l'accès au système de fichiers sans se soucier des répertoires .... – vwegert

+0

@vwegert - la plupart du code fait référence aux services utilisant des fils durs ou des numéros de ports configurés; par exemple. une pile de client HTTP Java a généralement les numéros de port 80 et 433 par défaut intégrés dans le code. Vous trouverez probablement cela dans le code C/C++. –

+0

@Stephen C: ... et pour les ports inférieurs à 1024 c'est une option valide à prendre. Dans ce cas (port du serveur de messages SAP), le numéro de port dépend d'un autre paramètre (le numéro de système). Habituellement, le port est défini comme sapms , où est l'ID système à trois lettres. Donc, si j'ai un système avec l'ID XYZ et le numéro de système 42, le service sapmsXYZ pointera vers le port 3642 - et j'aimerais pouvoir regarder ça ... – vwegert

3

Apache Tomcat fournissent une JNI obligatoire pour que:

package so3645405; 

import org.apache.tomcat.jni.Address; 
import org.apache.tomcat.jni.Library; 
import org.apache.tomcat.jni.Sockaddr; 
import org.apache.tomcat.jni.Socket; 

public final class Net { 
    private Net() { 

    } 

    public static int getServByName(final String serviceName) { 
     try { 
      Library.initialize("tcnative-1"); 
      long sa = Address.info(Address.APR_ANYADDR, Socket.APR_INET, 0, 0, 
        Library.globalPool()); 
      Sockaddr addr = new Sockaddr(); 
      Address.getservbyname(sa, serviceName); 
      Address.fill(addr, sa); 
      return addr.port; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return 0; 
    } 

    public static void main(final String[] args) { 
     if (args.length > 0) { 
      System.out.println(Net.getServByName(args[0])); 
     } else { 
      System.out.println("Usage: prog <serviceName>"); 
     } 
    } 
} 

Utilisation:

java -Djava.library.path=./ -classpath tomcat-coyote.jar;tomcat-juli.jar;. 
     so3645405.Net https 

sortie:

443 

Dépendances:

  • Temps de construction: tomcat-coyote.jar
  • Temps d'exécution: tomcat-coyote.jar, tomcat-july.jar, tcnative-1 lib.

Testé sous win64

+0

Merci pour l'indice, mais ce n'est pas une application basée sur Tomcat. – vwegert

Questions connexes