Как получить внутренний IP, внешний IP и шлюз по умолчанию для UPnP - PullRequest
0 голосов
/ 15 ноября 2009

Мне интересно, как бы я получил:

  • Внутренний IP-адрес;
  • Внешний IP-адрес; и
  • Шлюз по умолчанию

в системах Windows (WinSock) и Unix.

Заранее спасибо,

Ответы [ 3 ]

1 голос
/ 16 ноября 2009

Механизм общего назначения, работающий в Windows и UNIX, отсутствует. Под Windows вы хотите начать с GetIfTable(). В большинстве систем UNIX попробуйте getifaddrs(). Это даст вам различные вещи, такие как IP-адрес каждого интерфейса.

Я не уверен, как можно получить шлюз по умолчанию. Я предполагаю, что это доступно через некоторый вызов sysctl. Возможно, вы захотите начать с источника для утилиты netstat .

Внешний публичный адрес - это то, что компьютер никогда не знает. Единственный способ - подключиться к чему-либо в Интернете, и он скажет вам, с какого адреса вы пришли. Это одна из классических проблем с IPNAT.

1 голос
/ 18 ноября 2009

Решено благодаря: http://www.codeguru.com/forum/showthread.php?t=233261


#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>

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

int main(int nArgumentCount, char **ppArguments)
{
    WSADATA WSAData;

    // Initialize WinSock DLL
    if(WSAStartup(MAKEWORD(1, 0), &WSAData))
    {
        // Error handling
    }

    // Get local host name
    char szHostName[128] = "";

    if(gethostname(szHostName, sizeof(szHostName)))
    {
        // Error handling -> call 'WSAGetLastError()'
    }

    SOCKADDR_IN socketAddress;
    hostent *pHost        = 0;

    // Try to get the host ent
    pHost = gethostbyname(szHostName);
    if(!pHost)
    {
        // Error handling -> call 'WSAGetLastError()'
    }

    char ppszIPAddresses[10][16]; // maximum of ten IP addresses
    for(int iCnt = 0; (pHost->h_addr_list[iCnt]) && (iCnt < 10); ++iCnt)
    {
        memcpy(&socketAddress.sin_addr, pHost->h_addr_list[iCnt], pHost->h_length);
        strcpy(ppszIPAddresses[iCnt], inet_ntoa(socketAddress.sin_addr));

        printf("Found interface address: %s\n", ppszIPAddresses[iCnt]);
    }

    // Cleanup
    WSACleanup();
}
0 голосов
/ 15 ноября 2009

Linux:

ifconfig -a gives internal ip
netstat -a   gives default gateway

Windows

ipconfig /all  gives internal ip
netstat -a gives default gateway

Я не уверен, как окончательно определить внешний ip в любой системе

...