近日做一VC客户端,需要获取本机的外网IP地址,查询了相关资料,因为使用的宽带上网方式,本机的外网IP其实不在本机,故没有办法直接获取到,所以是用Get方法从其他网站获取,实际用的是从新浪和ip138两个获取,来个双备份。
从新浪获取:
BOOL GetIPAddressFromSinaAPI() { CString strTemp; m_strIPServerSina = "http://ipapi.sinaapp.com/api.php?f=text"; strTemp = doGet(m_strIPServerSina); CString strIPInfo = ConvertUTF8toGB2312(strTemp,strTemp.GetLength()); int i = 0; const char* iIndex = strstr(strIPInfo,"IP地址:"); if( iIndex != NULL ) { char temp[128]; sprintf_s(temp,"%s",iIndex); char ip[128] = {'\0'}; unsigned int i = 0; for(i = strlen("IP地址:"); i< strlen(temp); i++) { ip[i- strlen("IP地址:")] = temp[i]; if( (temp[i] < 46) || (temp[i] > 57) ) { ip[i- strlen("IP地址:")] = '\0'; m_strIP = ip; break; } } } else { return FALSE; } iIndex = strstr(strIPInfo,"归属地信息:"); if( iIndex == 0x0000 ) { m_strCity = "unknown"; } else { m_strCity = iIndex+strlen("归属地信息:"); } return TRUE; }
从ip138获取:
BOOL GetIPAddressFromIP138() { CString strTemp; m_strIPServerIP138= "http://iframe.ip138.com/ic.asp"; strTemp = doGet(m_strIPServerIP138); int i = 0; char* ipStart = (char*)strstr(strTemp,"您的IP是:["); if( NULL == ipStart ) return FALSE; char* ipEnd = (char*)strstr(ipStart,"]"); if( NULL == ipEnd ) return FALSE; char* cityStart = ipEnd+1; if( NULL == cityStart)return FALSE; *ipEnd = '\0'; m_strIP = ipStart+strlen("您的IP是:["); char* cityRealStart = strstr(cityStart,"来自:"); if( NULL == cityRealStart ) return FALSE; char* cityEnd = strstr(cityRealStart,"<"); if( NULL== cityEnd ) return FALSE; *cityEnd = '\0'; m_strCity = cityRealStart + strlen("来自:"); return TRUE; }
说明一下,两个函数里面所使用的doGet,是Get方式与服务器通信,网上可以寻找到一个封装VC进行POST/GET通信的类CHttpClient,这个doGet即是里面的一个成员函数。如果返回TRUE,那么m_strIP就是IP的字符串,比如“111.112.120.222”,m_strCity则是归属地字符串,比如“天津市 电信”。
VC获取外网IP
最新推荐文章于 2018-05-09 14:25:56 发布