如何获取UPnP的内部IP,外部IP和默认网关

时间:2009-11-15 20:35:55

标签: c windows linux winsock ip

我想知道如何获得:

  • 内部IP地址;
  • 外部IP地址;和
  • 默认网关

在Windows(WinSock)和Unix系统中。

提前致谢,

3 个答案:

答案 0 :(得分:1)

没有适用于Windows和UNIX的通用机制。在Windows下,您希望以GetIfTable()开头。在大多数UNIX系统下,请尝试getifaddrs()。这些将为您提供各种功能,如每个接口的IP地址。

我不确定如何获得默认网关。我猜它可以通过sysctl的一些调用来获得。您可能希望从the netstat utility的源代码开始。

外部公共地址是计算机永远不会知道的。唯一的方法是连接到互联网上的东西,让它告诉你你来自哪个地址。这是IPNAT的经典问题之一。

答案 1 :(得分:1)

解决了谢谢: 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();
}

答案 2 :(得分:0)

Linux的:

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

视窗:

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

我不确定如何在两个系统中明确确定外部IP