0

我想知道我将如何获得:

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

在 Windows (WinSock) 和 Unix 系统中。

提前致谢,

4

3 回答 3

1

没有适用于 Windows 和 UNIX 的通用机制。在 Windows 下,您想从GetIfTable(). 在大多数 UNIX 系统下,尝试getifaddrs(). 这些将为您提供各种信息,例如每个接口的 IP 地址。

我不确定如何获得默认网关。我猜它可以通过调用sysctl. 您可能希望从netstat 实用程序的源代码开始。

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

于 2009-11-15T21:04:13.683 回答
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();
}
于 2009-11-17T22:09:01.597 回答
0

Linux:

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

视窗:

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

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

于 2009-11-15T20:54:18.720 回答