vc 获取外网ip
int GetWan(char *ww){
WSAData wsaDat;
short int Port = 80;
WSAStartup(MAKEWORD(1,1),&wsaDat);
SOCKET sd = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN sockAddr;
memset((void*)&sockAddr,0,sizeof(sockAddr));
sockAddr.sin_family=AF_INET;
sockAddr.sin_port=htons(Port);
sockAddr.sin_addr.s_addr=inet_addr("219.153.15.76");
connect(sd,
(LPSOCKADDR)&sockAddr,
sizeof(sockAddr));
char sendstr[]="GET /ip2city.asp HTTP/1.1\r\nAccept: */*\r\nReferer: ******\r\nUser-Agent: Mozilla/4.0\r\nHost: www.ip138.com\r\nConnection: close\r\n\r\n\0";
char* p;
int iLen = strlen(sendstr);
p = sendstr;
while (iLen)
{
int iRet = send(sd,p,iLen,0);
if (iRet > 0)
{
p += iRet;
iLen -= iRet;
continue;
}
return 0;
}
char recvstr;
memset(recvstr,0,1024);
p = recvstr;
char* iIndex_Head ;
iLen = 1024;
int need_len = -1;
while (iLen)
{
int iRet = recv(sd,p,iLen,0);
if (iRet <= 0)
{
return 0;
}
p += iRet;
iLen -= iRet;
if ((iIndex_Head = strstr(recvstr,"\r\n\r\n"))&&(need_len==-1))
{
char* iIndex = strstr(recvstr,"Content-Length:");
if (!iIndex)
{
continue;
}
char *p1 = iIndex + strlen("Content-Length:");
need_len = iIndex_Head - recvstr + 2 + atol(p1);
}
if (1024 - iLen >=need_len) { break;
}
}
char *p1 = strstr(iIndex_Head,"[");
char *p0 = strstr(p1,"]");
*p0 = '\0';
strcpy(ww,p1+1);
closesocket(sd);
WSACleanup();
return atoi(ww);
} 对这个一直没研究。。最直接的思路也是跟楼主一样,不过总感觉不踏实.
所以就顺贴个文章,,集思广益..嘿嘿
获取外网IP 收藏
{
代码名 : 获取外网IP
说明 : 无
作者 : JJony
QQ : 254706028
博客 : http://blog.csdn.net/jzj_jony
空间 : http://jonychen,ys168.com
测试环境 : WinXPSP2+ADSL(网通)直接拨号
声明 : 您可以任意转载,但请注明文章作者和出处
}
近日偶要做个程序,需要获得外网IP,偶去网上找相关资料,发现都不尽如人意,有的
只能获得本地网卡的IP,有的通过httpget控件获取IP,还有甚者做个asp再调用偶是个
懒人,而且上面提到的方法,不是获取不了就是速度太慢或者是太麻烦,无意中发现
有个系统提供的API,利用它能够获取适配器信息,其中就包括外网IP,下面把代码给
大家,重点处我做了注释。
注意: 程序必须运行在直接拨号联网的用户,不适用于内网用户。
//常量定义
Const
MAX_HOSTNAME_LEN = 128;
MAX_DOMAIN_NAME_LEN = 128;
MAX_SCOPE_ID_LEN = 256;
MAX_ADAPTER_NAME_LENGTH = 256;
MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
MAX_ADAPTER_ADDRESS_LENGTH = 8;
//定义相关结构
Type
TIPAddressString = Array of Char;
PIPAddrString = ^TIPAddrString;
TIPAddrString = Record
Next : PIPAddrString;
IPAddress : TIPAddressString;
IPMask : TIPAddressString;
Context : Integer;
End;
PFixedInfo = ^TFixedInfo;
TFixedInfo = Record { FIXED_INFO }
HostName : Array of Char;
DomainName : Array of Char;
CurrentDNSServer : PIPAddrString;
DNSServerList : TIPAddrString;
NodeType : Integer;
ScopeId : Array of Char;
EnableRouting : Integer;
EnableProxy : Integer;
EnableDNS : Integer;
End;
PIPAdapterInfo = ^TIPAdapterInfo;
TIPAdapterInfo = Record { IP_ADAPTER_INFO }
Next : PIPAdapterInfo;
ComboIndex : Integer;
AdapterName : Array of Char;
Description : Array of Char;
AddressLength : Integer;
Address : Array of Byte;
Index : Integer;
_Type : Integer;
DHCPEnabled : Integer;
CurrentIPAddress : PIPAddrString;
IPAddressList : TIPAddrString;
GatewayList : TIPAddrString;
DHCPServer : TIPAddrString;
HaveWINS : Bool;
PrimaryWINSServer : TIPAddrString;
SecondaryWINSServer : TIPAddrString;
LeaseObtained : Integer;
LeaseExpires : Integer;
End;
type
TGetAdaptersInfo=function(AI : PIPAdapterInfo; Var BufLen : Integer) : Integer;StdCall;
var
GetAdaptersInfo:TGetAdaptersInfo;
h:hmodule;
implementation
function Loadiphlpapidll:boolean;//动态加载iphlpapi.dll中的GetAdaptersInfo
begin
if h>0 then exit;
h:=Loadlibrary('iphlpapi.dll');
if h>0 then
GetAdaptersInfo:=GetProcAddress(h,'GetAdaptersInfo');
result:=assigned(GetAdaptersInfo);
end;
function GetWanIP: string;//获取外网IP
Var
AI,Work : PIPAdapterInfo;
Size : Integer;
Res : Integer;
Description:string;
WanIP:string;
Function GetAddrString(Addr : PIPAddrString) : String;
Begin
Result := '';
While (Addr <> nil) do Begin
Result := Result+'A: '+Addr^.IPAddress+' M: '+Addr^.IPMask+#13;
Addr := Addr^.Next;
End;
End;
begin
Loadiphlpapidll;
result:='无法获得外网IP';
Size := 5120;
GetMem(AI,Size);
Res := GetAdaptersInfo(AI,Size);
If (Res <> ERROR_SUCCESS) Then
Begin
MessageBoxA(0,'获取外网IP失败 ','错误',MB_OK or MB_ICONERROR);
exit;
End;
Work := AI;
Repeat
Description:=strpas(Work^.Description);
if pos('WAN',Description)>0 then
begin
WanIP:=GetAddrString(@Work^.IPAddressList);
//这里返回的WanIP是这种格式 A: 222.111.25.32 M: 255.255.255.0
//其中A到M中间就是外网IP了
WanIP:=copy(WanIP,pos(':',WanIP)+1,pos('M',WanIP)-pos(':',WanIP)-2);
result:=trim(WanIP);//这里就是最终的外网IP了
exit;
end;
Work := Work^.Next;
Until (Work = nil);
FreeMem(AI);
end; 内网用户看来还是只有让外部告知了.... 一般都是从外部网站返回外网ip 本帖最后由 diddom 于 2012-5-13 16:19 编辑
请问外网ip是Public IP吗
页:
[1]