获取本地机器名字与IP地址(使用套接字)
2016-08-12 13:22
387 查看
使用套接字获取本地机器的主机名字与IP地址:
测试代码:
但是,这种方法存在一个问题:就是只能获取一个网卡的ip地址,而且当你的机器上装有以太网卡和无线网卡,它优先获取的是无线网卡的地址。话不多说,下面贴出的是,获取机器上面所有网卡的IP地址:
#include <Windows.h>
#include <Iphlpapi.h>
#include <vector>
#include <string>
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
std::vector<std::string> GetLocalAddress()
{
std::vector<std::string> vecAddrs;
vecAddrs.clear();
std::string strAddress;
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
//得到结构体大小,用于GetAdaptersInfo参数
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;
//其中stSize参数既是一个输入量也是一个输出量
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
//如果函数返回的是ERROR_BUFFER_OVERFLOW,
//则说明GetAdaptersInfo参数传递的内存空间不够
//同时其传出stSize,表示需要的空间大小
if (ERROR_BUFFER_OVERFLOW == nRel)
{
//释放原来的内存空间
delete pIpAdapterInfo;
//重新申请内存空间用来存储所有网卡信息
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
}
if (ERROR_SUCCESS == nRel)
{
//输出网卡信息//可能有多网卡,因此通过循环去判断
while (pIpAdapterInfo)
{
//可能网卡有多IP,因此通过循环去判断
IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
switch(pIpAdapterInfo->Type)
{
case MIB_IF_TYPE_OTHER:
case MIB_IF_TYPE_ETHERNET:
case MIB_IF_TYPE_TOKENRING:
case MIB_IF_TYPE_FDDI:
case MIB_IF_TYPE_PPP:
case MIB_IF_TYPE_LOOPBACK:
case MIB_IF_TYPE_SLIP:
{
strAddress = pIpAddrString->IpAddress.String;
//有时可能获取的IP地址是0.0.0.0,需要过滤掉
if(std::string("0.0.0.0") == strAddress)
break;
vecAddrs.push_back(strAddress);
break;
}
default:
//未知类型网卡就跳出
break;
}
pIpAdapterInfo = pIpAdapterInfo->Next;
}
}
//释放内存空间
if (pIpAdapterInfo)
{
delete pIpAdapterInfo;
pIpAdapterInfo = NULL;
}
return vecAddrs;
}
int main()
{
std::vector<std::string> data = GetLocalAddress();
std::vector<std::string> ::iterator itr = data.begin();
for (itr; itr!=data.end(); ++itr)
{
std::cout << (*itr).c_str() << "\r\n" << std::endl;
}
system("pause");
return 0;
}
#include <string> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") bool get_inside_ip(std::string &szHostName, std::string &szIpAddr) { WSADATA wsa; WSAStartup(MAKEWORD(2, 2), &wsa); SOCKET skt = socket(2, 1, 0); //获得主机名 char HostName[128]; if(gethostname(HostName, 128) != 0) { return false; } szHostName = std::string(HostName); // 获得主机ip地址 struct hostent * pHost = gethostbyname(HostName); for(int j = 0; j<4; j++ ) { char buf[128]; if(j > 0) szIpAddr += "."; sprintf_s(buf, "%u", (unsigned int)((unsigned char*)pHost->h_addr_list[0])[j]); szIpAddr.append(std::string(buf)); } closesocket(skt); WSACleanup(); return true; }
测试代码:
int main() { std::string szHostName, szIpAddr; bool bOkey = get_inside_ip(szHostName, szIpAddr); printf("name : %s, ip : %s\n", szHostName.c_str(), szIpAddr.c_str()); system("pause"); return 0; }
但是,这种方法存在一个问题:就是只能获取一个网卡的ip地址,而且当你的机器上装有以太网卡和无线网卡,它优先获取的是无线网卡的地址。话不多说,下面贴出的是,获取机器上面所有网卡的IP地址:
#include <Windows.h>
#include <Iphlpapi.h>
#include <vector>
#include <string>
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
std::vector<std::string> GetLocalAddress()
{
std::vector<std::string> vecAddrs;
vecAddrs.clear();
std::string strAddress;
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
//得到结构体大小,用于GetAdaptersInfo参数
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;
//其中stSize参数既是一个输入量也是一个输出量
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
//如果函数返回的是ERROR_BUFFER_OVERFLOW,
//则说明GetAdaptersInfo参数传递的内存空间不够
//同时其传出stSize,表示需要的空间大小
if (ERROR_BUFFER_OVERFLOW == nRel)
{
//释放原来的内存空间
delete pIpAdapterInfo;
//重新申请内存空间用来存储所有网卡信息
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
}
if (ERROR_SUCCESS == nRel)
{
//输出网卡信息//可能有多网卡,因此通过循环去判断
while (pIpAdapterInfo)
{
//可能网卡有多IP,因此通过循环去判断
IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
switch(pIpAdapterInfo->Type)
{
case MIB_IF_TYPE_OTHER:
case MIB_IF_TYPE_ETHERNET:
case MIB_IF_TYPE_TOKENRING:
case MIB_IF_TYPE_FDDI:
case MIB_IF_TYPE_PPP:
case MIB_IF_TYPE_LOOPBACK:
case MIB_IF_TYPE_SLIP:
{
strAddress = pIpAddrString->IpAddress.String;
//有时可能获取的IP地址是0.0.0.0,需要过滤掉
if(std::string("0.0.0.0") == strAddress)
break;
vecAddrs.push_back(strAddress);
break;
}
default:
//未知类型网卡就跳出
break;
}
pIpAdapterInfo = pIpAdapterInfo->Next;
}
}
//释放内存空间
if (pIpAdapterInfo)
{
delete pIpAdapterInfo;
pIpAdapterInfo = NULL;
}
return vecAddrs;
}
int main()
{
std::vector<std::string> data = GetLocalAddress();
std::vector<std::string> ::iterator itr = data.begin();
for (itr; itr!=data.end(); ++itr)
{
std::cout << (*itr).c_str() << "\r\n" << std::endl;
}
system("pause");
return 0;
}
相关文章推荐
- 使用InetAddress类获取本地计算机的IP地址和主机名
- 使用InterAddress类获取本地主机的本地名和IP地址
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第九节 获取网卡–IP地址映射表
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十九节 Ping一个IP地址
- Javascript与Activex交互获取本地mac,ip地址的代码
- 获取本地IP地址,并在IP CONTROL控件中显示出来
- Java中获取本地IP地址
- 获取本地IP地址和主机名
- MFC获取本地IP地址
- 用python获取本地的ip地址
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十八节 在本地电脑的地址解析协议(ARP )表中创建和删除一个ARP
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第二十一节 增加和删除一个IP地址
- Windows XP中轻松获取未使用的IP地址
- Delphi 如何获取本地计算机名和IP地址
- C# 获取本地IP地址以及MAC地址
- 获取本地机器IP地址(C#)
- 在vb中使用Iphlpapi.dll获取网络信息 第二章 第十八节 在本地电脑的地址解析协议(ARP )表中创建和删除一个ARP
- C# 获取本地IP地址以及MAC地址
- 使用批处理文件轻松更改本地IP地址
- 使用jquery的ajax,轻松从纯真网(cz88.net)获取IP地址对应地区名