WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Помогите Плизз с МАС-адресом !!

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Помогите Плизз с МАС-адресом !!
TurboMX опубликован 12-08-2001 07:14 MSK   Click Here to See the Profile for TurboMX   Click Here to Email TurboMX  
Помогите отыскать исходники на С/C++ по определению МАС-адреса !!!!
server_mouse опубликован 12-08-2001 13:24 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Задача стоит по имени компьтера в сети
определять его MAC-адрес.(адрес сетевой карты)
Может -быть можно как-то иначе ,но я не знаю.
Этот код по идее должен определить по имени
IP-адрес(это он делает),а дальше SendARP
должна по IP-адресу определить MAC.
SendARP работает только под Win.2000
(под 95.98 возвращает error code 50- not_supported).Компилировалось в Buildere
(может в этом причина?)

//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>
#include <svcguid.h>
#include <iphlpapi.h>


int main(int argc, char* argv[])
{
WSADATA data;
char name[25];
int error;
unsigned long BufferLength = 1024;
unsigned long MacAddr;
unsigned long AddrLen;
PULONG PMacAddr = &MacAddr;
PULONG PAddrLen = &AddrLen;
DWORD ArpResult;
// char BufferName[1024];
char BufferName2[1024];
HANDLE Lookup;
LPHANDLE pLookup=&Lookup;
GUID SearchGuid = SVCID_INET_HOSTADDRBYNAME; //SVCID_INET_HOSTADDRBYINETSTRING;
WSAQUERYSET QuerySet;
WSAQUERYSET* pQuerySet = &QuerySet;
QuerySet.dwSize=sizeof(WSAQUERYSET);
QuerySet.lpServiceClassId = &SearchGuid;
QuerySet.lpVersion=NULL;
QuerySet.dwNameSpace=NS_ALL;
QuerySet.lpNSProviderId=NULL;
QuerySet.lpszContext=NULL;
QuerySet.dwNumberOfProtocols=0;
QuerySet.lpafpProtocols= NULL;//aAFProtocols;
QuerySet.lpszComment=NULL;
QuerySet.lpszQueryString=NULL;
QuerySet.dwNumberOfCsAddrs=0;
QuerySet.lpcsaBuffer=NULL;
QuerySet.dwOutputFlags=0;
QuerySet.lpBlob=NULL;
if (WSAStartup(0x202,&data) == 0)
{

printf("Enter name\n");
scanf ("%24s",name);
printf("\n");
QuerySet.lpszServiceInstanceName=name;
if (WSALookupServiceBegin(pQuerySet,LUP_RETURN_ALL,pLookup) !=0)
{
printf("WSALookupServiceBegin fail\n");
error = WSAGetLastError();
printf("error is %d\n",error);
}
else
{
if( WSALookupServiceNext(Lookup,0,&BufferLength,(LPWSAQUERYSET)BufferName2)==0)
{

printf("address is ");
printf(inet_ntoa(((LPSOCKADDR_IN)(((LPWSAQUERYSET)(BufferName2))->lpcsaBuffer->RemoteAddr.lpSockaddr))->sin_addr));
printf("\n");
if ((ArpResult=SendARP( ((IPAddr)(((LPSOCKADDR_IN)(((LPWSAQUERYSET)(BufferName2))->lpcsaBuffer->RemoteAddr.lpSockaddr))->sin_addr.S_un.S_addr)),0,PMacAddr,PAddrLen)) == NO_ERROR)
printf("ARP succeded\n");
else
{
printf ("ARP failed erorr = %d\n",ArpResult);
}
}
else
{

printf("Resolving fail\n");
error = WSAGetLastError();
printf("error is %d\n",error);
}
if (WSALookupServiceEnd(Lookup)!=0)
printf("WSALookupServiceEnd fail\n");
}
if (WSACleanup() == 0)
;
else
printf("exit fail\n");
}
else
{
printf("init fail\n");
}
printf("press any key to exit\n");
getch();
return 0;
}
//---------------------------------------------------------------------------


(c) alex

Я содрал, да простит меня автор, с http://www.programme.ru/cgi-bin/wwwboard/3/messages/255.shtml

Так что посмотри ещё там.

m_fox опубликован 12-08-2001 16:14 MSK     Click Here to See the Profile for m_fox  Click Here to Email m_fox     
Q> Как узнать MAC адрес сетевой карты?
A>


Вариант1:

From : Sergey Gazimagomedov 2:453/11.13

Мне нужен был МАС адpес, так я его получал, пользуясь NetBIOS.
Добавляешь имя NetBIOS и посылаешь на имя станции, нужной для опpеделения(можно
и своей) датагpамный пакет с заполненным NCB.
Вот исходник моей функции для опpеделения МАС адpеса.

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точках и так
необходим.

Вариант2:

From : Alexey Grachyov <rook@relex.ru>

#include <windows.h>
#include <winsock.h>
#include <wsipx.h>
#include <wsnwlink.h>
#include <stdio.h>

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

Вариант3:

From: MSDN

#include <windows.h>
#include <wincon.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

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


TurboMX опубликован 13-08-2001 01:08 MSK     Click Here to See the Profile for TurboMX  Click Here to Email TurboMX     
Спасибо всем ответившим на моё сообщение, но мне надо исходники на чистом С/C++ или на АСМе. Вообщето надо под Linux написать программку.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.