Часто задаваемые вопросы и ответы по C/C++/Visual C++
Последнее обновление: 27.08.2003
FAQ по C/C++/Visual C++
Работа с сетью
Как расшарить папку
Вариант 1
Составители: SUnteXx, Leprecon
Как получить свой IP
A: (SUnteXx)
Оригинальная ссылка: www.sources.ru

Вариант 1

Данная статья показывает, как можно определить свой IP (имеется в виду IPv4).
Начнем сразу с кода:
DWORD GetCurentIP()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(1,1), &wsaData); // инициализируем socket'ы используя Ws2_32.dll для процесса

    char HostName[1024]; // создаем буфер для имени хоста
    DWORD m_HostIP = 0;

    if(!gethostname(HostName, 1024)) // получаем имя хоста
    {
        if(LPHOSTENT lphost = gethostbyname(HostName)) // получаем IP хоста, т.е. нашего компа
            m_HostIP = ((LPIN_ADDR)lphost->h_addr)->s_addr; // преобразуем переменную типа LPIN_ADDR в DWORD
    }
    WSACleanup(); // освобождаем сокеты, т.е. завершаем использование Ws2_32.dll
    return m_HostIP;
}
Если требуется создать строку из IP, то код будет выглядеть вот так:
DWORD GetCurentIP(LPSTR lpStringWithIP = 0)
// lpStringWithIP - поинтер на массив, состоящий из 17 символов
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(1,1), &wsaData); // инициализируем socket'ы используя Ws2_32.dll для процесса

    char HostName[1024]; // создаем буфер для имени хоста
    DWORD m_HostIP = 0;

    if(!gethostname(HostName, 1024)) // получаем имя хоста
    {
        if(LPHOSTENT lphost = gethostbyname(HostName)) // получаем IP хоста, т.е. нашего компа
            m_HostIP = ((LPIN_ADDR)lphost->h_addr)->s_addr; // преобразуем переменную типа LPIN_ADDR в DWORD
    }
    WSACleanup(); // освобождаем сокеты, т.е. завершаем использование Ws2_32.dll

    if (lpStringWithIP) // если поинтер на строку не нулевой
        strcpy(lpStringWithIP, inet_ntoa(*((in_addr*)lphost->h_addr_list[0]))); // то преобразуем IP в строку

    return m_HostIP;
}
Если надо получить сами числа, то код будет такой:
DWORD GetCurentIP(BYTE a1, BYTE a2, BYTE a3, BYTE a4)
// BYTE a1, BYTE a2, BYTE a3, BYTE a4 - биты адреса IP
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(1,1), &wsaData); // инициализируем socket'ы используя Ws2_32.dll для процесса

    char HostName[1024]; // создаем буфер для имени хоста
    DWORD m_HostIP = 0;

    if(!gethostname(HostName, 1024)) // получаем имя хоста
    {
        if(LPHOSTENT lphost = gethostbyname(HostName)) // получаем IP хоста, т.е. нашего компа
            m_HostIP = ((LPIN_ADDR)lphost->h_addr)->s_addr; // преобразуем переменную типа LPIN_ADDR в DWORD
    }
    WSACleanup(); // освобождаем сокеты, т.е. завершаем использование Ws2_32.dll

    a1=((LPIN_ADDR)lphost->h_addr)->s_b1; // присваиваем значение 1-го байта адреса
    a2=((LPIN_ADDR)lphost->h_addr)->s_b2; // присваиваем значение 2-го байта адреса
    a3=((LPIN_ADDR)lphost->h_addr)->s_b3; // присваиваем значение 3-го байта адреса
    a4=((LPIN_ADDR)lphost->h_addr)->s_b4; // присваиваем значение 4-го байта адреса

    /* // или можно еще так
    a1=lphost->h_addr_list[0];
    a2=lphost->h_addr_list[1];
    a3=lphost->h_addr_list[2];
    a4=lphost->h_addr_list[3]; */

    return m_HostIP;
}

Содержание Обсудить на форуме « Предыдущая статья | Следующая статья »
Перейти к FAQ:  
FAQ составлен по материалам Форума на Исходниках.Ру.
Copyright © 2002 by Sources.ru. All rights reserved.