如何用 API 把网址转变为 IP?(100分)

  • 主题发起人 主题发起人 QSmile
  • 开始时间 开始时间
Q

QSmile

Unregistered / Unconfirmed
GUEST, unregistred user!
我在写一个程序时遇到的问题, 你知不知道如何用 API 把网址转变为 IP,中途可能要通过 HTTP或 SOCKS4,5 代理。
 
DNS转换与代理无关,或者对代理是透明的。
可以使用INDY中的IdStackWinsock单元中TIdStackWinsock类的ResolveHost函数。函数声明如下:
function ResolveHost(const AHost: string): string;
 
有没有其它的?
 
查询GetHostByName就可以了!
 
GetHostByName
 
不行!
如果网络是通过网关或路由器到外网,就可以。
如果网络是通过 HTTP 或 Socket 代理到外网,这样绝对不行!

如果通过代理服务器上网,都不能用 Ping 通,但可以上网。
我想 HTTP代理 是用 HTTP 协议的方法直接连接HTTP 代理服务器。
而 Socket4 是用 Socket4 协议连接到Socket 代理,
Socket5 与Socket4差不多,只不过多了用户名与密码

我想看一下 HTTP 协议的说明,
哪里有下载。
 
转贴:: 不知道是否有用 ^_^
function LocalIP : string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe:PHostEnt;
pptr:PaPInAddr;
Buffer:array [0..63] of char;
I:Integer;
GInitData:TWSADATA;
begin
WSAStartup($101, GInitData);
Result :='';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^ <> nil do begin
result:=StrPas(inet_ntoa(pptr^^));
Inc(I);
end;
WSACleanup;
end;
 
如果是一台私网上的机器,通过一台与公网相连的代理服务器代理上网,那上面的方法就都不行了,因为DNS解析是由代理服务器完成的。
这样的话实现起来就困难了。。。
 
我改他人的函数Show一下咯:调试能过了的!!!希望对你有帮助,呵呵~~~~~~~~~~~~

uses {...,}Winsock;

procedure ShowHostIP(HostName: WideString);
var
wVersionRequested : WORD;
wsaData : TWSAData;
p : PHostEnt;
s : String;
p2 : pchar;
begin
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
S:= HostName;
p := GetHostByName(PChar(s));
ShowMessage(Format('Computer name is ''%s''.', [p^.h_Name]));
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
ShowMessage(Format('IP address is %s.',[p2]));
WSACleanup;
end;
 
多谢你们了!
但我认为这些方法不能通过代理服务器
我想可能要用 HTTP协议或 Socket4,5 协议。
谁有这方面的资料?
 
算了看你这个样来个Ping怎么样呢,
我想绝对OK了吧,
在代理下,你Ping + 对方网址 通不通呢????
我想是没有道理不通的,
以防你又有什么鸟问题,如果你说Ping得通的话,
我就去再整理一个ShowHostIP~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我的感慨:分数难赚呀,55555555555555,不过还是得加油~~~~~~~~~~~~~~`
 
哦!是我理解错了!
在代理下不能得到对方的IP。
但可以访问。
因为代理把内网与外网分开了。
 
多人接受答案了。
 
后退
顶部