您可以使用 gethostname 后跟 gethostbyname 来获取本地接口内部 IP。
但是,此返回的 IP 可能与您的外部 IP 不同。要获取您的外部 IP,您必须与外部服务器通信,该服务器会告诉您您的外部 IP 是什么。因为外部 IP 不是您的,而是您的路由器。
//Example: b1 == 192, b2 == 168, b3 == 0, b4 == 100
struct IPv4
{
unsigned char b1, b2, b3, b4;
};
bool getMyIP(IPv4 & myIP)
{
char szBuffer[1024];
#ifdef WIN32
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 0);
if(::WSAStartup(wVersionRequested, &wsaData) != 0)
return false;
#endif
if(gethostname(szBuffer, sizeof(szBuffer)) == SOCKET_ERROR)
{
#ifdef WIN32
WSACleanup();
#endif
return false;
}
struct hostent *host = gethostbyname(szBuffer);
if(host == NULL)
{
#ifdef WIN32
WSACleanup();
#endif
return false;
}
//Obtain the computer's IP
myIP.b1 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b1;
myIP.b2 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b2;
myIP.b3 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b3;
myIP.b4 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b4;
#ifdef WIN32
WSACleanup();
#endif
return true;
}
您也可以始终只使用代表本地计算机的 127.0.0.1。
Windows 中的子网掩码:
您可以通过查询此注册表项的子项来获取子网掩码(以及网关和其他信息):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
查找注册表值 SubnetMask。
Windows中获取接口信息的其他方法:
您还可以使用以下选项检索您要查找的信息:
WSAIoctl与此选项:SIO_GET_INTERFACE_LIST