阿杰 发表于 2010-1-27 21:11:30

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);
}

a2010xxb 发表于 2010-9-23 15:51:25

对这个一直没研究。。最直接的思路也是跟楼主一样,不过总感觉不踏实.
所以就顺贴个文章,,集思广益..嘿嘿

获取外网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;

马大哈 发表于 2010-9-24 12:53:42

内网用户看来还是只有让外部告知了....

9908006 发表于 2010-9-24 22:16:30

一般都是从外部网站返回外网ip

diddom 发表于 2012-5-13 16:08:32

本帖最后由 diddom 于 2012-5-13 16:19 编辑


请问外网ip是Public IP吗
页: [1]
查看完整版本: vc 获取外网ip