我想知道如何获得:
在 Windows (WinSock) 和 Unix 系统中。
提前致谢,
没有适用于 Windows 和 UNIX 的通用机制。在 Windows 下,您需要以
GetIfTable()
开头。在大多数 UNIX 系统下,请尝试 getifaddrs()
。这些将为您提供各种信息,例如每个接口的 IP 地址。
我不确定如何获取默认网关。我猜想它可以通过调用
sysctl
来获得。您可能想从netstat实用程序的源代码开始。
外部公共地址是计算机永远不知道的东西。唯一的方法是连接到互联网上的某个东西并让它告诉您来自哪个地址。这是 IPNAT 的经典问题之一。
解决感谢: 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();
}
Linux:
ifconfig -a gives internal ip
netstat -a gives default gateway
窗户:
ipconfig /all gives internal ip
netstat -a gives default gateway
我不确定如何明确确定任一系统中的外部 IP
在高山上与 miniupnpc
upnpc -s | grep "ExternalIPAddress" | cut -d '=' -f2