找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9876|回复: 4

[分享] vc 获取外网ip

 火.. [复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-1-27 21:11:30 | 显示全部楼层 |阅读模式
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[1024];
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);
}
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

2

主题

17

回帖

0

精华

铜牌会员

积分
35
发表于 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[0..4*4-1] of Char;

  PIPAddrString = ^TIPAddrString;
  TIPAddrString = Record
    Next      : PIPAddrString;
    IPAddress : TIPAddressString;
    IPMask    : TIPAddressString;
    Context   : Integer;
  End;

  PFixedInfo = ^TFixedInfo;
  TFixedInfo = Record { FIXED_INFO }
    HostName         : Array[0..MAX_HOSTNAME_LEN+3] of Char;
    DomainName       : Array[0..MAX_DOMAIN_NAME_LEN+3] of Char;
    CurrentDNSServer : PIPAddrString;
    DNSServerList    : TIPAddrString;
    NodeType         : Integer;
    ScopeId          : Array[0..MAX_SCOPE_ID_LEN+3] of Char;
    EnableRouting    : Integer;
    EnableProxy      : Integer;
    EnableDNS        : Integer;
  End;

  PIPAdapterInfo = ^TIPAdapterInfo;
  TIPAdapterInfo = Record { IP_ADAPTER_INFO }
    Next                : PIPAdapterInfo;
    ComboIndex          : Integer;
    AdapterName         : Array[0..MAX_ADAPTER_NAME_LENGTH+3] of Char;
    Description         : Array[0..MAX_ADAPTER_DESCRIPTION_LENGTH+3] of Char;
    AddressLength       : Integer;
    Address             : Array[1..MAX_ADAPTER_ADDRESS_LENGTH] 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;

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-9-24 12:53:42 | 显示全部楼层
内网用户看来还是只有让外部告知了....
我就是嗷嗷叫的老马了......

16

主题

81

回帖

0

精华

银牌会员

积分
611
发表于 2010-9-24 22:16:30 | 显示全部楼层
一般都是从外部网站返回外网ip

96

主题

158

回帖

4

精华

核心会员

积分
6513
发表于 2012-5-13 16:08:32 | 显示全部楼层
本帖最后由 diddom 于 2012-5-13 16:19 编辑


请问外网ip是Public IP吗
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表