自动设置NAT的Delphi控件
[ quickburro 发表于 2007-10-22 15:39:00 ]
最近根据uPnP技术、用delphi写了一个进行自动端口映射的控件TAutoNAT,用于在自行开发的delphi软件中实现自动端口映射,使得中间件QuickBurro的安装软件具备了自动进行NAT设置的能力,大大简化了软件的安装。
*************************************
TAutoNAT控件使用说明
*************************************
一、属性
1、可读写类型属性
Name:对象名称,字符型
Tag:控件序号,数值型
Timeout:任务执行超时值
2、只读类型属性(用于读取任务执行结果)
TaskType: 当前执行的任务类别号: 1-搜索 2-取控制页地址 3-增加端口 4-取外网地址 5-删除端口
RouterIp: 路由器内网IP(本地网IP)
RouterPort: 路由器控制端口(本地网端口)
RouterLocation: 路由器设备位置URL
RouterName: 路由器设备名称
RouterUSN: 路由器设备标识名
RouterURL: 路由器URL
ExternalIp: 路由器外网IP
ControlURL: 控制页URL
URLbase: 控制页基地址
二、事件
OnTaskFail:当任务执行失败时激发
OnTaskSuccess:当任务执行成功时激发
三、方法
SearchRouter(): boolean;
查找路由器设备的方法,返回结果为任务是否已顺利提交。任务执行成功时,激发OnTaskSuccess事件,
执行失败时,激发OnTaskFail事件。若任务执行成功,通过读下列属性值可得到路由器信息:
TaskType=1 (搜索设备)
RouterIp=路由器内网IP(本地网IP)
RouterPort=路由器控制端口(本地网端口)
RouterLocation=路由器设备位置URL
RouterName=路由器设备名称
RouterUSN=路由器设备标识名
RouterURL=路由器URL
URLbase=控制页基地址
GetControlURL()
取路由器控制页URL地址,返回结果为任务是否已顺利提交。任务执行成功时,激发OnTaskSuccess事件,
执行失败时,激发OnTaskFail事件。若任务执行成功,通过读下列属性值可得到控制页地址:
TaskType=2 (取控制页URL)
ControlURL=控制页URL
AddNatMapping(NatPortName: string; ExternalPort: integer; LocalIp: string; LocalPort: integer; Protocol: string)
增加一个端口映射项,返回结果为任务是否已顺利提交,其中入口参数如下:
NatPortName:映射项名称
ExternalPort:外网端口号
LocalIP:被映射的内网IP
LocalPort:被映射的内网端口
Protocol:协议,取“TCP”、“UDP”或“ALL”
任务执行成功时,激发OnTaskSuccess事件,执行失败时,激发OnTaskFail事件。若任务执行成功,以下属性被赋值:
TaskType=3 (增加映射项)
GetExternalIp(): boolean
取路由器外网IP地址,返回结果为任务是否已顺利提交。
任务执行成功时,激发OnTaskSuccess事件,执行失败时,激发OnTaskFail事件。若任务执行成功,以下属性被赋值:
TaskType=4 (取外网IP)
DeleteNatMapping(ExternalPort: integer; Protocol: string): boolean
删除一个端口映射项,返回结果为任务是否已顺利提交,其中入口参数如下:
ExternalPort:被删除项对应的外网端口号
Protocol:协议,取“TCP”、“UDP”或“ALL”
任务执行成功时,激发OnTaskSuccess事件,执行失败时,激发OnTaskFail事件。若任务执行成功,以下属性被赋值:
TaskType=5 (删除映射项)
四、编程举例
下面是使用TAutoNAT控件进行自动端口映射的编程例子:建一个新工程,在Form1里放置六个按钮、一个Memo、一个TAutoNAT控件,
然后,对各个对象的事件进行编程。
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, AutoNAT;
type
TForm1 = class(TForm)
AutoNAT1: TAutoNAT;
Memo1: TMemo;
Label1: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
BitBtn6: TBitBtn;
procedure BitBtn6Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure AutoNAT1TaskFail(Sender: TObject);
procedure AutoNAT1TaskSuccess(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//
// 退出程序...
procedure TForm1.BitBtn6Click(Sender: TObject);
begin
form1.close;
end;
//
// 搜索路由器...
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if not autonat1.SearchRouter then
memo1.lines.add(''搜索路由器时出现异常,搜索失败!'')
else
memo1.lines.add(''正在搜索路由器,请稍等...'')
end;
//
// 获取控制页...
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if not autonat1.GetControlURL then
memo1.lines.add(''取控制页URL出现异常,操作失败!'')
else
memo1.lines.add(''正在取控制页URL,请稍等...'')
end;
//
// 增加端口映射项...
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
if not autonat1.AddNatMapping(''TestUDP'',81,''192.168.1.105'',81,''UDP'') then
memo1.lines.add(''增加端口时出现异常,操作失败!'')
else
memo1.lines.add(''正在增加端口映射项,请稍等...'')
end;
//
// 取外网IP...
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
if not autonat1.GetExternalIp then
memo1.lines.add(''取外网IP时出现异常,操作失败!'')
else
memo1.lines.add(''正在取外网IP,请稍等...'')
end;
//
// 删除端口映射项...
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
if not autonat1.DeleteNatMapping(81,''UDP'') then
memo1.lines.add(''删除端口时出现异常,操作失败!'')
else
memo1.lines.add(''正在删除端口映射项,请稍等...'')
end;
//
// 任务失败时...
procedure TForm1.AutoNAT1TaskFail(Sender: TObject);
var
j: integer;
begin
j:=autonat1.TaskType;
case j of
//
// 搜索设备...
1: begin
memo1.lines.add(''搜索路由器失败!'');
end;
//
// 取路由器控制页地址...
2: begin
memo1.lines.add(''取控制页地址失败!'');
end;
//
// 增加端口...
3: begin
memo1.lines.add(''增加端口失败!'');
end;
//
// 取外网IP...
4: begin
memo1.lines.add(''取外网IP失败!'');
end;
//
// 删除端口...
5: begin
memo1.lines.add(''删除端口失败!'');
end;
end;
end;
//
// 任务成功时...
procedure TForm1.AutoNAT1TaskSuccess(Sender: TObject);
var
j: integer;
begin
j:=autonat1.TaskType;
case j of
//
// 搜索设备...
1: begin
memo1.lines.add('''');
memo1.lines.add(''搜索路由器成功!'');
memo1.lines.add(''RouterName=''+autonat1.RouterName);
memo1.lines.add(''RouterLocation=''+autonat1.RouterLocation);
memo1.lines.add(''RouterUSN=''+autonat1.RouterUSN);
memo1.lines.add(''RouterIP=''+autonat1.RouterIP);
memo1.lines.add(''RouterPort=''+inttostr(autonat1.RouterPort));
memo1.lines.add(''RouterURL=''+autonat1.RouterURL);
memo1.lines.add(''URLBase=''+autonat1.URLBase);
end;
//
// 取路由器控制页地址...
2: begin
memo1.lines.add('''');
memo1.lines.add(''取控制页地址成功!'');
memo1.lines.add(''ControlURL=''+autonat1.ControlURL);
end;
//
// 增加端口...
3: begin
memo1.lines.add('''');
memo1.lines.add(''增加端口成功!'');
end;
//
// 取外网IP...
4: begin
memo1.lines.add('''');
memo1.lines.add(''取外网IP成功!'');
memo1.lines.add(''外网IP=''+autonat1.ExternalIp);
end;
//
// 删除端口...
5: begin
评论7
最新资源