我想知道我将如何获得:
- 内部 IP 地址;
- 外部IP地址;和
- 默认网关
在 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