这个函数是GetHostByName()异步版本
这个函数不会引起阻塞,由于使用时要用到消息,所以有点麻烦,不过会者不难
声明如下:
HANDLE PASCAL FAR WSAAsyncGetHostByName ( HWND hWnd,
unsigned int wMsg, const char FAR * name, char FAR * buf,
int buflen );
hWnd 当异步请求完成时,应该接收消息的窗口句柄.
wMsg 当异步请求完成时,将要接收的消息.
name 指向主机名的指针.
buf 接收hostent数据的数据区指针.注意该数据区必须大于hostent结构的大小.这是因为不仅Windows Sockets实现要用该数据区域容纳hostent结构,hostent结构的成员引用的所有数据也要在该区域内.建议用户提供一个MAXGETHOSTSTRUCT字节大小的缓冲区.
buflen 上述数据区的大小.
我们用这个函数实现上节中同一功能:得到网站IP
全部代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
//下面自己定义一个消息,因为这个函数必须用到
const
wm_getip=wm_user+100;//自己定义一个消息,
type
Tgetip=record//消息的结构
msg:word;
wparam:word;
lparam:word;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
procedure mymsg(var msg:Tgetip);Message wm_getip;//这就是消息函数
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
winsock;
{$R *.dfm}
var
WData:tWSAData;
HEnt:HostEnt;
IPad:string;
h:thandle;
procedure tform1.mymsg(var msg:tgetip);
begin
with HEnt do
IPad:=Format('%d.%d.%d.%d',[Byte(h_addr^[0]),Byte(h_addr^[1]),Byte(h_addr^[2]),Byte(h_addr^[3])]);
edit2.Text:=HEnt.h_name;
edit3.Text:=ipad;//得到ip
WSACleanup;//注销
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WSAStartup(2,WData);//初始
h:=WSAAsyncGetHostByName(self.Handle,wm_getip,pchar(edit1.Text),pchar(@hent),MAXGETHOSTSTRUCT)
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
wsacancelasyncrequest(h);//可用于终止,不会引起阻塞
end;
end.
posted on 2009-02-02 22:06
小叶子 阅读(940)
评论(0) 编辑 收藏 引用 所属分类:
delphi winsock