2011-11-26 4 views
5

Tôi sử dụng ứng dụng Java/Android cần gửi một số dữ liệu đến máy chủ trên mạng cục bộ. vấn đề là địa chỉ IP của máy chủ là động nên cách duy nhất để tìm nó là tra cứu bởi địa chỉ MAC của nó. Điều này có thể xảy ra trong Java không? Bạn có thấy bất kỳ tùy chọn nào khác không?Java - tìm máy chủ theo địa chỉ MAC

+0

Tôi đã nghi ngờ tôi một MAC tra cứu địa chỉ sẽ có thể, nhưng bạn không thể kết nối bằng tên máy chủ? Vì vậy, thay cho '74.125.237.116', bạn sẽ kết nối với' www.google.com'. –

Trả lời

0

Điều này có thể thực hiện được trong Java không?

Không có Java thuần túy.

Không có dịch vụ nào trực tiếp ánh xạ địa chỉ MAC tới địa chỉ IP. Ngăn xếp mạng của hệ điều hành máy chủ lưu trữ của bạn sử dụng giao thức ARP và (trên Linux/UNIX) ARP daemon để ánh xạ địa chỉ IP tới địa chỉ MAC. AFAIK, không thể sử dụng giao thức ARP từ Java.

Điều tốt nhất bạn có thể thực hiện (trên Linux) là chạy "arpd -l" làm lệnh bên ngoài. Điều này sẽ kết xuất các ánh xạ ARP của daemon theo một định dạng được xác định rõ ràng mà ứng dụng Java của bạn có thể đọc và phân tích cú pháp. Nếu máy chủ của bạn đang hoạt động trên mạng cục bộ, địa chỉ MAC của nó sẽ xuất hiện cùng với địa chỉ IP tương ứng. Nhưng nếu nó không có trên mạng cục bộ thì các chương trình phát sóng ARP của nó sẽ không đến được máy của bạn, do đó sẽ không có một mục nào trong các bảng của daemon.


Sẽ tốt hơn nếu chỉ định máy chủ của bạn địa chỉ IP tĩnh ... và địa chỉ DNS. Một khả năng khác là để máy chủ tự đăng ký sử dụng dịch vụ Dynamic DNS.

+0

bạn có thể làm điều đó thông qua phát sóng, truy vấn MAC 'NetworkInterface.getHardwareAddress()' và kiểm tra xem nó có khớp với tiêu chí hay không, tức là máy chủ phải hợp tác. Đó là một câu chuyện khác nếu thiết bị Android thực sự có thể phát sóng. – bestsss

+0

@bestsss - có thể sẽ không hoạt động. Trong ARP thông thường, bạn phát địa chỉ IP và lấy lại địa chỉ MAC. Trừ khi máy chủ cài đặt Inverse ARP - http://tools.ietf.org/html/rfc2390 - bạn không thể yêu cầu địa chỉ IP cho địa chỉ MAC. –

+0

Tôi có nghĩa là một phát sóng thường xuyên trong đó có MAC như tải trọng và máy chủ sẽ trả lời cho phát sóng cung cấp nó đã được bắt đầu trên MAC đó (do đó hợp tác xã). Chỉ cần khám phá. Ngày thứ 2 mặc dù một cách tiếp cận tàn bạo cũng có thể làm, chỉ cần gửi cho tất cả các IP trong mạng như máy quét cổng. – bestsss

2

Tìm máy chủ theo địa chỉ MAC chỉ có thể hoạt động trong mạng cục bộ của bạn. Địa chỉ Mac là một lớp trong IP Adresses. Không tồn tại định tuyến dựa trên Mac Adresses cho các mạng khác.

Broadcast/Multicast

Nếu bạn đang tìm kiếm một giải pháp mà chỉ hoạt động trong mạng nội bộ, lắng nghe trên và gửi để phát sóng hoặc multicast có thể là một lựa chọn cho bạn. Nếu bạn gửi một gói tin đến một địa chỉ quảng bá, mọi máy chủ trong mạng cục bộ sẽ nhận gói này và có thể trả lời nếu đó là máy chủ bạn đang tìm kiếm. Multicast khác nhau tùy ý, rằng chỉ những host muốn nhận các gói tin được gửi tới một địa chỉ mulitcast cụ thể mới nhận được các gói này. Nếu bạn đang sử dụng Multicast, bạn cần phải chọn một địa chỉ cho ứng dụng của bạn, mỗi khách hàng gửi các gói tin đến địa chỉ này, mọi máy chủ được tìm thấy đều lắng nghe trên địa chỉ này. Thậm chí còn tồn tại một số mạng (ví dụ như một số mạng đại học), nơi các gói multicast được định tuyến đến một tập hợp giới hạn các mạng cục bộ khác.

DNS hoặc máy chủ tĩnh khác

Bạn có thể sử dụng máy chủ thứ hai có địa chỉ IP tĩnh mà bạn sử dụng để tìm serevr động. Máy chủ động của bạn sẽ cho máy chủ tĩnh địa chỉ IP của mình bất cứ khi nào nó thay đổi. Khách hàng của bạn sẽ yêu cầu máy chủ tĩnh cho địa chỉ của máy chủ động. Các mẫu này hoạt động trên toàn bộ internet, được gọi là máy chủ động và máy khách của bạn.

Máy chủ tĩnh này có thể là máy chủ DNS của bạn hoặc máy chủ dns của một số nhà cung cấp dịch vụ đăng ký. Nhưng điều này không giới hạn ở DNS. DNS được thiết kế để tìm hiểu cách tiếp cận các dịch vụ/máy chủ, nhưng điều này có thể được thực hiện trên bất kỳ giao thức nào. Ví dụ: nếu bạn thích dịch vụ web, điều này có thể được thực hiện trên một số ứng dụng web/http do bạn phát triển.

2

Chỉ cần một cảnh báo nhỏ: mã này là chưa được kiểm tra,

Cố gắng đào sâu vào bộ nhớ cache arp, như vậy:

public static String getIpFromArpCache(String macaddr) { 
    if (ip == null) 
     return null; 
    BufferedReader br = null; 
    try { 
     br = new BufferedReader(new FileReader("/proc/net/arp")); 
     String line; 
     while ((line = br.readLine()) != null) { 
      String[] splitted = line.split(" +"); 
      if (splitted != null && splitted.length >= 4 && macaddr.equals(splitted[3])) { 
       // Basic sanity check 
       String ip = splitted[0]; 
       if (validateIp(ip)) { 
        return ip; 
       } else { 
        return null; 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      br.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

private static final String PATTERN = 
    "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; 

public static boolean validateIp(final String ip){   

     Pattern pattern = Pattern.compile(PATTERN); 
     Matcher matcher = pattern.matcher(ip); 
     return matcher.matches();    
} 

thói quen thay đổi từ here

+0

nó không có nghĩa là MAC sẽ nằm trong bộ đệm cục bộ. Do đó trong một số trường hợp nó có thể làm việc nhưng cũng có thể nó không. – bestsss

+0

Tôi biết, bạn nói đúng, anh ấy có thể phải thực hiện phát đa hướng trước khi thực hiện việc này. Tôi sẽ kiểm tra nó sau cuối tuần và cập nhật câu trả lời. – Reno