2010-09-05 56 views
6

Tôi cần một cái gì đó giống như chức năng C getservbyname() cho một ứng dụng Java. Tôi phải phân tích một tệp cấu hình có thể chứa số cổng hoặc tên dịch vụ và trong trường hợp sau, tôi cần phải chuyển đổi số này thành số cổng để chuyển sang thư viện. Tôi tìm thấy this bug và có một chút ngạc nhiên khi câu hỏi được hỏi vào năm 1997 (!) Và thậm chí không được xem xét để thực hiện trong 13 năm. Tôi không thực sự muốn làm công cụ phân tích nền tảng cụ thể cho bản thân mình - có cách nào khác không?Nhận số cổng cho tên dịch vụ?

+0

Nice. Một cuộc bỏ phiếu bình chọn mà không có bất kỳ bình luận nào. Rất hữu ích ... – vwegert

Trả lời

1

Trong this question Tôi đã tìm thấy thư viện here có vẻ như làm hết sức mình để cung cấp chức năng nền tảng chéo.

+0

Cảm ơn gợi ý .... Thật không may, đó là một thư viện được cấp phép LGPL khiến nó khó sử dụng trong dự án EPL của tôi. Và nó sử dụng Maven và kéo trong jruby và một phụ thuộc lạ (jaffl) mà dường như trang web chính thức http://kenai.com/projects/jaffl/ nói với tôi rằng dự án không tồn tại .. – vwegert

2

Hầu hết các tính năng mới được thêm vào Java đã có một trường hợp sử dụng đã được chứng minh là một thư viện Java mã nguồn mở trong một thời gian. ví dụ. thư viện đồng thời chỉ được thêm vào sau khi nó là thư viện độc lập trong 6 năm. Đóng cửa chỉ được thêm vào bởi vì hầu hết các ngôn ngữ động khác có nó bây giờ. (Và rất miễn cưỡng)

Tôi đồng ý rằng bạn sẽ nghĩ rằng chức năng này có sẵn trong Java ngoại trừ, tôi cũng sẽ vì vậy tôi nghĩ rằng rất ít người sử dụng nó.

+0

Cách tôi nhìn thấy nó, cho phép Mạng TCP không có độ phân giải tên dịch vụ cho số cổng giống như cho phép truy cập hệ thống tập tin mà không quan tâm đến thư mục .... – vwegert

+0

@vwegert - hầu hết mã đều đề cập đến các dịch vụ sử dụng dây cứng hoặc cổng * được cấu hình * chứ không phải tên cổng; ví dụ. một ngăn xếp máy khách Java http thường có các số cổng 80 và 433 mặc định được tích hợp vào mã. Có thể bạn sẽ tìm thấy điều này trong mã C/C++. –

+0

@Bước C: ... và đối với các cổng dưới 1024 thì đó là tùy chọn hợp lệ để thực hiện. Trong trường hợp này (cổng máy chủ tin nhắn SAP), số cổng phụ thuộc vào một số tham số khác (số hệ thống). Thông thường, cổng được đặt làm sapms , trong đó là ID hệ thống gồm 3 chữ cái. Vì vậy, nếu tôi đã có một hệ thống với ID XYZ và hệ thống số 42, dịch vụ sapmsXYZ sẽ trỏ đến cổng 3642 - và tôi muốn có thể xem nó lên ... – vwegert

3

Apache Tomcat cung cấp một số JNI ràng buộc cho rằng:

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>"); 
     } 
    } 
} 

Cách sử dụng:

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

Output:

443 

Dependencies:

  • Thời gian xây dựng: tomcat-coyote.jar
  • Thời gian chạy: tomcat-coyote.jar, tomcat-july.jar, lib gốc tcnative-1.

Tested dưới win64

+0

Cảm ơn gợi ý, nhưng đây không phải là một ứng dụng dựa trên Tomcat. – vwegert

Các vấn đề liên quan