На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> IP по MAC
    Подскажите, можно ли и как получить IP адресс по физическому адресу (MAC) машины?

    Заранее благодарю
      а как вообще через дельфи узнать МАС адрес
        Вот на что наткнулся в одном из ФАКов:

        Вариант1:
        From : Sergey Gazimagomedov 2:453/11.13
        Мне нужен был МАС адpес, так я его получал, пользуясь NetBIOS.
        Добавляешь имя NetBIOS и посылаешь на имя станции, нужной для опpеделения(можно
        и своей) датагpамный пакет с заполненным NCB.
        Вот исходник моей функции для опpеделения МАС адpеса.


        ExpandedWrap disabled
          UCHAR MYLIBAPI GetAdapterID(char *Name, // NetBIOS ??? ???????
          UINT lana_num,
          CARDID *ID) // 6 ???????? ??????
          {
          UCHAR rc = 0;
          UCHAR Status[256];
          while( lstrlen(Name) - 15)
          lstrcat(Name, " ");
          memset(&SNcb, 0, sizeof(NCB));
          SNcb.ncb_command = NCBASTAT;
          SNcb.ncb_buffer = (LPSTR)Status;
          SNcb.ncb_length = 256;
          lstrcpy(SNcb.ncb_callname, Name);
          SNcb.ncb_lana_num = lana_num;
          rc = Netbios( &SNcb );
          if(rc ==0){
          memcpy(ID, Status, 6);
          }
          return(SNcb.ncb_cmd_cplt);
          }

        Это под Win32. Конечно должен быть пpотокол NetBIOS, но он в фоpточках и так
        необходим.


        Взято с Vingrad.ru http://forum.vingrad.ru

        Вариант2:
        From : Alexey Grachyov

        ExpandedWrap disabled
          #include  
          #include  
          #include  
          #include  
          #include  
          void main()
          {
          int iAdapters,iOpt=sizeof(iAdapters),iSize=sizeof(SOCKADDR_IPX);
          SOCKET skNum;
          SOCKADDR_IPX Addr;
          WSADATA Wsa;
          if(WSAStartup(0x0101,&Wsa)) return;
          if((skNum=socket(AF_IPX,SOCK_DGRAM,NSPROTO_IPX))!=INVALID_SOCKET)
          {
          memset(&Addr,0,sizeof(Addr));
          Addr.sa_family=AF_IPX;
          if(bind(skNum,(SOCKADDR *)&Addr,iSize)!=SOCKET_ERROR)
          {
          if(getsockopt(skNum,NSPROTO_IPX,IPX_MAX_ADAPTER_NUM,
          (char *)&iAdapters,&iOpt)!=SOCKET_ERROR)
          {
          while(iAdapters)
          {
          IPX_ADDRESS_DATA Data;
          memset(&Data,0,sizeof(Data));
          Data.adapternum=iAdapters-1;
          iOpt=sizeof(Data);
          if(getsockopt(skNum,NSPROTO_IPX,IPX_ADDRESS,(char
          *)&Data,&iOpt)!=SOCKET_ERROR)
          {
          printf("Addr: %02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X\n",
          (int)Data.netnum[0],(int)Data.netnum[1],(int)Data.netnum[2],
          (int)Data.netnum[3],(int)Data.netnum[4],(int)Data.netnum[5],
          (int)Data.netnum[6],(int)Data.netnum[7],(int)Data.netnum[8],
          (int)Data.netnum[9]);
          }
          iAdapters--;
          }
          }
          }
          closesocket(skNum);
          }
          WSACleanup();
          }

        Взято с Vingrad.ru http://forum.vingrad.ru

        Вариант3:
        From: MSDN

        ExpandedWrap disabled
          #include  
          #include  
          #include  
          #include  
          #include  
          typedef struct _ASTAT_
          {
          ADAPTER_STATUS adapt;
          NAME_BUFFER NameBuff [30];
          }ASTAT, * PASTAT;
          ASTAT Adapter;
          void main (void)
          {
          NCB Ncb;
          UCHAR uRetCode;
          char NetName[50];
          memset( &Ncb, 0, sizeof(Ncb) );
          Ncb.ncb_command = NCBRESET;
          Ncb.ncb_lana_num = 0;
          uRetCode = Netbios( &Ncb );
          printf( "The NCBRESET return code is: 0x%x \n", uRetCode );
          memset( &Ncb, 0, sizeof (Ncb) );
          Ncb.ncb_command = NCBASTAT;
          Ncb.ncb_lana_num = 0;
          strcpy( Ncb.ncb_callname, "* " );
          Ncb.ncb_buffer = (char *) &Adapter;
          Ncb.ncb_length = sizeof(Adapter);
          uRetCode = Netbios( &Ncb );
          printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );
          if ( uRetCode == 0 )
          {
          printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n",
          Adapter.adapt.adapter_address[0],
          Adapter.adapt.adapter_address[1],
          Adapter.adapt.adapter_address[2],
          Adapter.adapt.adapter_address[3],
          Adapter.adapt.adapter_address[4],
          Adapter.adapt.adapter_address[5] );
          }
          }


        Автор ответа: Garik

        Взято с Vingrad.ru http://forum.vingrad.ru

        --------------------------------------------------------------------------------


        Автор: Daniel Wischnewski

        Для того, чтобы этот код работал, необходимо включить в проект юнит NB30. Простой вызов функции GetMACAddress возвращает адрес первого установленного сетевого адаптера.

        Совместимость: Delphi 3.x (или выше)

        Данный пример был составлен на основе статьи на сайте Borland:
        http://community.borland.com/article/0,1410,26040,00.html


        ExpandedWrap disabled
          uses  
            NB30;  
           
          function GetAdapterInfo(Lana: Char): String;  
          var  
            Adapter: TAdapterStatus;  
            NCB: TNCB;  
          begin  
            FillChar(NCB, SizeOf(NCB), 0);  
            NCB.ncb_command := Char(NCBRESET);  
            NCB.ncb_lana_num := Lana;  
            if Netbios(@NCB) <> Char(NRC_GOODRET) then  
            begin  
              Result := 'mac not found';  
              Exit;  
            end;  
           
            FillChar(NCB, SizeOf(NCB), 0);  
            NCB.ncb_command := Char(NCBASTAT);  
            NCB.ncb_lana_num := Lana;  
            NCB.ncb_callname := '*';  
           
            FillChar(Adapter, SizeOf(Adapter), 0);  
            NCB.ncb_buffer := @Adapter;  
            NCB.ncb_length := SizeOf(Adapter);  
            if Netbios(@NCB) <> Char(NRC_GOODRET) then  
            begin  
              Result := 'mac not found';  
              Exit;  
            end;  
            Result :=  
              IntToHex(Byte(Adapter.adapter_address[0]), 2) + '-' +  
              IntToHex(Byte(Adapter.adapter_address[1]), 2) + '-' +  
              IntToHex(Byte(Adapter.adapter_address[2]), 2) + '-' +  
              IntToHex(Byte(Adapter.adapter_address[3]), 2) + '-' +  
              IntToHex(Byte(Adapter.adapter_address[4]), 2) + '-' +  
              IntToHex(Byte(Adapter.adapter_address[5]), 2);  
          end;  
           
          function GetMACAddress: string;  
          var  
            AdapterList: TLanaEnum;  
            NCB: TNCB;  
          begin  
            FillChar(NCB, SizeOf(NCB), 0);  
            NCB.ncb_command := Char(NCBENUM);  
            NCB.ncb_buffer := @AdapterList;  
            NCB.ncb_length := SizeOf(AdapterList);  
            Netbios(@NCB);  
            if Byte(AdapterList.length) > 0 then  
              Result := GetAdapterInfo(AdapterList.lana[0])  
            else  
              Result := 'mac not found';  
          end;  

        Взято с Исходников.ru http://www.sources.ru
        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0.0590 ]   [ 15 queries used ]   [ Generated: 24.10.26, 01:53 GMT ]