Меню
Категории
Как узнать IP и MAC адрес моего компа в сети на C++
29 февраля, 2008 Программинг

Как узнать 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;
}

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

  2. #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");
    }
    */

Добавить комментарий




*