VC 获取本地ip地址
来源:互联网 发布:js获取当前时间格转换 编辑:程序博客网 时间:2024/06/11 00:12
获取本地IP地址有两种做法。一种是使用gethostname函数,代码如下:
- bool CSocketComm::GetLocalAddress(std::string& strAddress)
- {
- char strHost[HOSTNAME_SIZE] = { 0 };
-
-
- if (SOCKET_ERROR != gethostname(strHost, sizeof(strHost)))
- {
- struct hostent* hp;
- hp = gethostbyname(strHost);
- if (hp != NULL && hp->h_addr_list[0] != NULL)
- {
-
- if ( hp->h_length < 4)
- return false;
-
-
- strHost[0] = 0;
-
-
- sprintf(strHost, "%u.%u.%u.%u",
- (UINT)(((PBYTE) hp->h_addr_list[0])[0]),
- (UINT)(((PBYTE) hp->h_addr_list[0])[1]),
- (UINT)(((PBYTE) hp->h_addr_list[0])[2]),
- (UINT)(((PBYTE) hp->h_addr_list[0])[3]));
-
- strAddress = strHost;
- return true;
- }
- }
- else
- SetLastError(ERROR_INVALID_PARAMETER);
-
- return false;
- }
这种方法有一个弊端,就是只能获取一个网卡的ip地址,而且当你的机器上装有以太网卡和无线网卡,它优先获取的是无线网卡的地址。
第二种做法可以获取多个网卡的IP地址,代码如下:
- #include <Iphlpapi.h>
- #pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
-
- bool CSocketComm::GetLocalAddress()
- {
- std::string strAddress;
- int nCardNo = 1;
-
- PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
-
- unsigned long stSize = sizeof(IP_ADAPTER_INFO);
-
- int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
-
- int netCardNum = 0;
-
- int IPnumPerNetCard = 0;
- if (ERROR_BUFFER_OVERFLOW == nRel)
- {
-
-
-
-
- delete pIpAdapterInfo;
-
- pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
-
- nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);
- }
- if (ERROR_SUCCESS == nRel)
- {
-
-
- while (pIpAdapterInfo)
- {
-
- 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;
-
- if(std::string("0.0.0.0")==strAddress)
- break;
- std::cout<<_T("第")<< nCardNo<<_T("张网卡的IP地址是")<< strAddress<<std::endl;
- nCardNo++;
- break;
- }
- default:
-
- break;
- }
- pIpAdapterInfo = pIpAdapterInfo->Next;
- }
- }
-
- if (pIpAdapterInfo)
- {
- delete pIpAdapterInfo;
- }
- }
0 0