Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение MAC адреса, Как это сделать? 
V
    Опции темы
criolit
  Дата 30.8.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.6.2006

Репутация: нет
Всего: нет



Привет всем!
Есть такой вопрос. Как определить MAC адрес компа в локальной сети средствами Java? Или это только на С надо чего-то писать?
Заранее спасибо!
PM MAIL   Вверх
LSD
Дата 30.8.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Средствами Java это не сделать. Можно написать функцию на Си и подключить ее к Java через JNI.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
criolit
Дата 30.8.2006, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.6.2006

Репутация: нет
Всего: нет



Ясно. Спасибо. Пойду к сишникам спрошу как это сделать.
PM MAIL   Вверх
redrick
Дата 5.9.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: нет
Всего: 5



ну, я бы небольшую поправку сделал - наверняка это уже написано кем-то и свою процедруру не надо будет писать.


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
LevanovSA
Дата 27.3.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.3.2009

Репутация: нет
Всего: нет



Код

package adress;

import java.awt.event.ActionEvent;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import jcifs.netbios.NbtAddress;

public class MyInetAddress extends JFrame implements ActionListener {

    JTextField tf;
    JTextArea ta, ta1;
    JButton bt;
    byte[] addr,addr1;
    int i;
    String s;

    MyInetAddress(String s) {
        super(s);
        setLayout(new FlowLayout(FlowLayout.LEFT));
        tf = new JTextField(10);
        Label lb = new Label("Введите IP");
        ta = new JTextArea(2, 10);
        ta1 = new JTextArea(2, 10);
        bt = new JButton("OK");

        add(tf);
        add(lb);
        add(ta);
        add(ta1);
        add(bt);

        tf.addActionListener(this);
        bt.addActionListener(this);
    }

    public static void main(String[] args) throws IOException, UnknownHostException {

        JFrame myframe = new MyInetAddress("IP Address");
        myframe.setLocation(400, 300);
        myframe.setSize(210, 140);
        myframe.show();
       myframe.setResizable(false);
        myframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @SuppressWarnings("static-access")
    @Override
    public void actionPerformed(ActionEvent e) {
        // throw new UnsupportedOperationException("Not supported yet.");
        if (e.getSource() == bt) {
            try {
               // s=tf.getText();
                //addr1=s.getBytes();
          

                addr = NbtAddress.getByName(tf.getText()).getMacAddress();
                InetAddress Address = InetAddress.getByName(tf.getText());
                ta.setText(Address.getHostName());
                for (i = 0; i < addr.length; i++) {
                    ta1.append(String.format("%02X%s", addr[i], (i < addr.length - 1) ? "-" : ""));
                }
            } catch (UnknownHostException ex) {
                Logger.getLogger(MyInetAddress.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }
}

PM MAIL   Вверх
jython
Дата 31.3.2009, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.3.2009

Репутация: нет
Всего: нет



Для определения MAC-адреса удалённого компьютера можно использовать NetBios: 

Код

NCB SNcb;     // Структура для работы с NetBios
UCHAR rc = 0;     //Код возврата 
UCHAR Status[256]; // Буфер для получения данных 
UCHAR HostName[]=_T("SomeHost"); // Имя удалённого компа 
BYTE MAC[6];    //Буфер для нашего MAC-адреса. 

memset( &SNcb, 0, sizeof(SNcb) ); 
SNcb.ncb_command = NCBRESET; 
SNcb.ncb_lana_num = 0; 
rc=Netbios( &SNcb ); //Сбрасываем NetBios

//Если HostName вдруг больше 15 символов его надо обрезать. 
while( lstrlen(HostName) - 15) 
    lstrcat(HostName, " "); 

memset(&SNcb, 0, sizeof(NCB)); 
SNcb.ncb_command = NCBASTAT; 
SNcb.ncb_buffer = (unsigned char*)Status; 
SNcb.ncb_length = 256;
lstrcpy((char*)SNcb.ncb_callname, HostName); 
SNcb.ncb_lana_num = 0;    //Сетевой адаптор по умалчанию 
rc = Netbios( &SNcb ); 
if(rc==NRC_GOODRET) //Если всё ОК 
memcpy(MAC, Status, 6)


Declared in Nb30.h
Use Netapi32.lib


НО! На машине NetBios может быть и выключен. Тогда можно вытащить его из таблицы IPMAC если хост вообще использует IP-протокол. Технология следующая: мы посыалем хосту любой IP-пакет, например по UDP. Система обязательно широковещательным ARP-пакетом запросит его MAC-адрес и если получит, занесёт его в таблицу IPMAC. Откуда мы его и заберём. Абсолютно неважно, какой IP-based протокол будет использован, и будет ли он установлен и/или принят удалённым хостом. Важно лишь то, что система захочет отослать IP-пакет, а для этого она обязательно должна узнать его MAC.
Пример консольного приложения:

Код

//--------stdafx.h-------- 
#include <stdio.h>
#include <windows.h>
#include <Winsock2.h>
//Use Ws2_32.lib 
#include <Iphlpapi.h>
//Use Iphlpapi.lib (in SDK) 
////==================== 

////-------- cpp-файл ---------- 

#include "stdafx.h" 
char ip[]="192.168.100.1"; 

int main(int argc, char* argv[]) 

//Будем использовать сокеты 
    WSADATA WsaData; 
    DWORD _ip=inet_addr(ip); 
    if (WSAStartup(0x0202, &WsaData)==NULL)    
        printf("WSA Starup OK!\n"); 

//Создаём UDP-сокет и отсылаем по нему любые данные 
    SOCKET udp_s; 
    SOCKADDR_IN udp_sin; 
    udp_s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
    if(udp_s!=SOCKET_ERROR) 
    { 
        udp_sin.sin_family = AF_INET; 
        udp_sin.sin_port = htons(5232); //Шлём на любой порт. 
        udp_sin.sin_addr.s_addr = _ip; 
        if(sendto(udp_s, "TEST", 5, NULL, (SOCKADDR*)&udp_sin, sizeof(udp_sin))>0) 
        { //Пакет отослан. Вытаскиваем MAC-адрес из системы 
            MIB_IPNETTABLE * pIpNetTable = (MIB_IPNETTABLE *) new char[0xFFFF]; 
            ULONG cbIpNetTable = 0xFFFF; 
            if (NO_ERROR == GetIpNetTable (pIpNetTable, &cbIpNetTable, TRUE)) 
            { 
                for (DWORD i = 0; i < pIpNetTable->dwNumEntries; i++)
                { 
                    if(pIpNetTable->table[i].dwAddr==_ip&&pIpNetTable->table[i].dwType!=2) 
                    { 
                        printf("IP:%s MAC:%X-%X-%X-%X-%X-%X\n", ip, 
                                    pIpNetTable->table[i].bPhysAddr[0], 
                                    pIpNetTable->table[i].bPhysAddr[1], 
                                    pIpNetTable->table[i].bPhysAddr[2], 
                                    pIpNetTable->table[i].bPhysAddr[3], 
                                    pIpNetTable->table[i].bPhysAddr[4], 
                                    pIpNetTable->table[i].bPhysAddr[5]); 
                                    delete[] pIpNetTable; 
                                    closesocket(udp_s); 
                         WSACleanup(); 
                         return 0; 
                    } 
             } 
             printf("MAC-address not found\n"); 
             delete[] pIpNetTable; 
            } 
            else printf("ERROR Open IPMAC table\n"); 
        } 
        else printf("Send data ERROR!\n"); 

        closesocket(udp_s); 
    } 
    else printf("ERROR open socket\n"); 

    WSACleanup();         //Освобождаем ресурсы 
    return 0; 
}


PS: Последний способ действует только для той подсети, где сам находишься. Если использовать HOST_IP из др. подсети, то в IPMAC таблице будет находится IP и MAC шлюза к HOST_IP.

PPS: MAC-адрес этто физический адрес устройства, и в общем случае
может иметь длинну отличную от 6 байт. 

Это сообщение отредактировал(а) jython - 31.3.2009, 11:08
PM MAIL WWW Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.1142 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.