Познавательный блог Мобильная врсия

Страницы

Промо

Как узнать IP и MAC адрес моего компа в сети на C++

Как узнать IP и MAC адрес моего компа в сети на C++. Для определения мы будем пользоваться функциями gethostname и gethostbyname из библиотеки winsock.h. Если у вас два и более сетевых подключений, программа покажет IP адрес первого в очереди.

#include <winsock.h>
#include <windows.h>

int main(int argc, char* argv[])
{
const int WSVer = 0x101;
WSAData wsaData;
hostent *h;
char Buf[128];
if (WSAStartup(WSVer, &wsaData) == 0)
{
if (gethostname(&Buf[0], 128) == 0)
{
h = gethostbyname(&Buf[0]);
if (h != NULL) MessageBox(0,inet_ntoa (*(reinterpret_cast<in_addr *>(*(h->h_addr_list)))),0,0);
else MessageBox(0,"Вы не в сети. И IP адреса у вас нет.",0,0);
}
WSACleanup;
}
return 0;
}

Также можно воспользоваться WinAPI функцией GetAdaptersInfo. Она тебе вернет информацию по всем сетевым адаптерам системы.WinAPI фукнции очень полезная вещь, рекомендую тебе почаще листать справочник.

Узнать MAC адрес можно как предыдущим способом, с помощью GetAdaptersInfo. Но также и другим:

#include <stdio.h>
#include <windows.h>
#include <Winsock2.h>
#include <Iphlpapi.h>

///-------- 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;
}

Комментарии

Комментарий от Slava [ 20 сентября, 2010, 13:17 ]

А как в первом примере сделать чтобы IP в переменную записывалось? =)

Комментарий от Vladimir [ 6 ноября, 2010, 21:02 ]

#include
#include
#include
#pragma inline
/*****************/
// Возвращает MAC адрес сетевой карты
// должны быть загружены сет. драйвера
/*****************/
/*
инт7А возвращает 10 байт в буфер указанный ES:SI по функции 9 в BX.
4 первых байта сетевой адрес какойто (вощем неважно), следующие 6 –
MAC адрес.
*/
void getMAC(char *mm)
{
unsigned char *adr=”0123456789″;
int i;
i=FP_SEG(adr);
asm{
push es
mov bx,9
mov si,adr
mov es,i
int 7Ah
pop es
}

for(i=4;i<10;i++){
sprintf(&mm[2*i-8],"%02hX",adr[i]);
}
mm[13]=0;
}
/***********ЗАкомментарено для самостоятельной проверки ***************/
/*
void main(void)
{ char adr[12];
getMAC(adr);
printf("%s",adr);
printf(" :adrMAC\n");
}

/////////////////////////////////

void main(void)
{ unsigned char *adrMAC="0123456789",mm[13];
int i;
asm{
mov bx,9
mov si,adrMAC
int 7Ah
}

for(i=4;i<10;i++){
printf("%02hX",adrMAC[i]);
}
printf(" :adrMAC\n");
getMAC(mm);
printf("%s",mm);
printf(" :adrMAC\n");
}
*/

Написать комментарий








Поиск по сайту

Статистика

Мета

  Разработка и дизайн — StvPromo.ru