Mam aplikację Java/Android, która musi przesłać dane do serwera w sieci lokalnej. Problem polega na tym, że adres IP serwera jest dynamiczny, więc jedynym sposobem znalezienia go jest wyszukiwanie według jego adresu MAC. Czy to możliwe w Javie? Czy widzisz jakieś inne opcje?Java - znajdź hosta pod adresem MAC
Odpowiedz
Czy to możliwe w Javie?
Nie w czystej Javie.
Brak usługi, która bezpośrednio odwzorowuje adresy MAC na adresy IP. Stos sieciowy systemu operacyjnego komputera hosta używa protokołu ARP i (w systemie Linux/UNIX), ARP daemon do mapowania adresów IP na adresy MAC. AFAIK, nie można używać protokołu ARP z Java.
Najlepszą rzeczą, jaką można zrobić (w systemie Linux), jest uruchomienie "arpd -l" jako polecenia zewnętrznego. Spowoduje to zrzucenie odwzorowań ARP demona w dobrze zdefiniowanym formacie, który aplikacja Java może odczytać i przeanalizować. Jeśli twój serwer jest aktywny w sieci lokalnej, jego adres MAC pojawi się wraz z odpowiednim adresem IP. Ale jeśli nie ma go w sieci lokalnej, jego transmisje ARP nie dotrą do twojego komputera, więc nie będzie wpisu w tabelach demona.
Lepiej byłoby przypisać serwerowi statyczny adres IP ... i adres DNS. Inną możliwością może być rejestracja samego serwera za pomocą usługi Dynamic DNS.
można to zrobić za pomocą transmisji, wysyłając zapytanie do MAC 'NetworkInterface.getHardwareAddress()' i sprawdzając, czy pasuje do kryteriów, tj. Serwer musi współpracować. To inna historia, jeśli urządzenie z Androidem może rzeczywiście nadawać. – bestsss
@bestsss - to prawdopodobnie nie zadziała. W zwykłym ARP nadajesz adres IP i odzyskujesz adres MAC. O ile serwer nie implementuje Inverse ARP - http://tools.ietf.org/html/rfc2390 - nie można zażądać adresu IP dla adresu MAC. –
Mam na myśli regularną transmisję, która zawiera MAC jako ładunek, a serwer odpowiada na transmisję pod warunkiem, że został uruchomiony na tym MAC (stąd spółdzielnia). Tylko odkrycie. Na drugiej, nawet brutalne podejście, wystarczy wysłać do wszystkich adresów IP w sieci, takich jak skaner portów. – bestsss
Wyszukiwanie hosta według adresu MAC może działać tylko w sieci lokalnej. Adresy MAC to jedna warstwa w ramach adresów IP. Nie ma routingu opartego na adresach MAC do innych sieci.
Broadcast/Multicast
Jeśli szukasz rozwiązania, które działa tylko w sieci lokalnej, na słuchanie i wysyłanie do transmisji lub multicast może być rozwiązaniem dla ciebie. Jeśli wysyłasz pakiet na adres rozgłoszeniowy, każdy host w sieci lokalnej odbiera ten pakiet i może odpowiedzieć, jeśli jest to serwer, którego szukasz. Multiemisja różni się w sposób konceptualny, że tylko te hosty, które chcą odbierać pakiety adresowane do konkretnego adresu mulitcast, otrzymują te pakiety. Jeśli korzystasz z Multicast, musisz wybrać adres dla swojej aplikacji, każdy klient wysyła pakiety na ten adres, każdy serwer, który zostanie znaleziony, nasłuchuje na tym adresie. Istnieje nawet pewna sieć (na przykład niektóre sieci uniwersyteckie), w której pakiety multiemisji są kierowane do ograniczonego zestawu innych sieci lokalnych.
DNS lub inny serwer statyczny
Można użyć drugiego serwera ze statycznym adresem IP, który jest używany do znalezienia dynamicznego serevr. Twój serwer dynamiczny powiadamia serwer statyczny o jego adresie IP, gdy tylko się zmieni. Klient poprosi serwer statyczny o adres serwera dynamicznego. Wzorce te działają na całym Internecie, nomatter, gdzie znajduje się serwer dynamiczny i klient.
Ten serwer statyczny może być twoim serwerem DNS lub serwerem dns jakiegoś dostawcy dyndns. Ale nie ogranicza się to do DNS. DNS został zaprojektowany w celu uzyskania informacji o tym, jak dotrzeć do usług/serwerów, ale można to zrobić za pomocą dowolnego protokołu. Na przykład, jeśli wolisz usługi internetowe, można to zrobić za pomocą opracowanej przez ciebie aplikacji http/web.
Tylko trochę uwaga: ten kod jest niesprawdzone,
Spróbuj kopanie w pamięci podręcznej ARP, tak:
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();
}
Modified rutyny z here
mam wątpliwości MAC wyszukiwanie adresu będzie możliwe, ale czy nie możesz połączyć się za pomocą nazwy hosta? Zamiast "74.125.237.116" łączysz się z 'www.google.com'. –