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

问题描述 投票:0回答:4

我想知道如何获得:

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

在 Windows (WinSock) 和 Unix 系统中。

提前致谢,

c windows linux winsock ip
4个回答
1
投票

没有适用于 Windows 和 UNIX 的通用机制。在 Windows 下,您需要以

GetIfTable()
开头。在大多数 UNIX 系统下,请尝试
getifaddrs()
。这些将为您提供各种信息,例如每个接口的 IP 地址。

我不确定如何获取默认网关。我猜想它可以通过调用

sysctl
来获得。您可能想从netstat实用程序的源代码开始。

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


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();
}

0
投票

Linux:

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

窗户:

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

我不确定如何明确确定任一系统中的外部 IP


0
投票

在高山上与 miniupnpc

upnpc -s | grep "ExternalIPAddress" | cut -d '=' -f2
© www.soinside.com 2019 - 2024. All rights reserved.