[network] Определение своего IP адреса
От: butcher Россия http://bu7cher.blogspot.com
Дата: 19.07.04 10:35
Оценка: 20 (4)
Здравствуйте,

Уже раз 5 на моей памяти в форумах поднимался вопрос по определению IP адресов локальной машины, решил выложить несколько реализаций.
Способ №1: Используя вызов WSAIoctl Winsock2 c кодом SIO_ADDRESS_LIST_QUERY
#include    <iostream>
#include    <winsock2.h>

#pragma        comment (lib, "ws2_32.lib")

int main(void)
{
    using            std::cout;
    using            std::cerr;
    using            std::endl;

    WSADATA        wd;
    SOCKET        sock;
    char            buf[65535];
    DWORD            dwSize = 65535;
    int                nRet;
    SOCKET_ADDRESS_LIST *pAddr;
    SOCKADDR*    saddr;
    
    nRet = WSAStartup(MAKEWORD(2,0), &wd);
    if(nRet != 0){
        cerr << "WSAStartup fail with code " << nRet << endl;
        return -1;
    }
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sock == INVALID_SOCKET){
        cerr << "socket fail with code " << WSAGetLastError() << endl;
        return -2;
    }
    ZeroMemory(buf, 65535);
    nRet = WSAIoctl(sock, SIO_ADDRESS_LIST_QUERY, NULL, 0, buf, 65535, &dwSize, NULL, NULL);
    if(nRet != SOCKET_ERROR){
        pAddr = reinterpret_cast<SOCKET_ADDRESS_LIST*>(buf);
        nRet = pAddr->iAddressCount;
        saddr = pAddr->Address->lpSockaddr;
        while (0 < nRet--){
            cout << inet_ntoa(reinterpret_cast<SOCKADDR_IN*>(saddr)->sin_addr) << endl;
            saddr++;
        }
        nRet = 0;
    }else {
        cerr << "WSAIoctl fail with code " << WSAGetLastError() << endl;
        nRet = -3;
    }
    closesocket(sock);
    WSACleanup();
    return nRet;
}

Способ №2: Используя IP Helper API
#include    <iostream>
#include    <windows.h>
#include    <iphlpapi.h>

#pragma        comment (lib, "iphlpapi")

void main (void)
{
    using                            std::cout;
    using                            std::cerr;
    using                            std::endl;
    
    char*                            buf;
    PIP_ADAPTER_INFO    pAdaptersInfo;
    PIP_ADDR_STRING        pAddr;
    DWORD                            dwSize = 0;

    if(GetAdaptersInfo(NULL, &dwSize) != ERROR_BUFFER_OVERFLOW){
        cerr << "GetAdaptersInfo fail" << endl;
        return;
    }
    buf = new char[dwSize];
    if (!buf) return;
    pAdaptersInfo = reinterpret_cast<PIP_ADAPTER_INFO>(buf);
    if (GetAdaptersInfo (pAdaptersInfo, &dwSize) == ERROR_SUCCESS){
        while (pAdaptersInfo){
            pAddr = &pAdaptersInfo->IpAddressList;
            while (pAddr){
                cout <<"Address: " << pAddr->IpAddress.String << "/" << 
                    pAddr->IpMask.String << endl;
                pAddr = pAddr->Next;
            }
            pAdaptersInfo = pAdaptersInfo->Next;
        }
    }
    delete[] buf;
}

Чуть позже представлю ещё один способ..

Нет ничего невозможного..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.