Delphi网络函数
unit net;
interface uses sysutils ,windows ,dialogs ,winsock ,classes ,comobj ,wininet;
//得到本机的局域网ip地址 function getlocalip(var localip:string): boolean; //通过ip返回机器名 function getnamebyipaddr(ipaddr: string; var macname: string): boolean ; //获取网络中sqlserver列表 function getsqlserverlist(var list: tstringlist): boolean; //获取网络中的所有网络类型 function getnetlist(var list: tstringlist): boolean; //获取网络中的工作组 function getgrouplist(var list: tstringlist): boolean; //获取工作组中所有计算机 function getusers(groupname: string; var list: tstringlist): boolean; //获取网络中的资源 function getuserresource(ipaddr: string; var list: tstringlist): boolean; //映射网络驱动器 function netaddconnection(netpath: pchar; password: pchar;localpath: pchar): boolean; //检测网络状态 function checknet(ipaddr:string): boolean; //检测机器是否登入网络 function checkmacattachnet: boolean;
//判断ip协议有没有安装 这个函数有问题 function isipinstalled : boolean; //检测机器是否上网 function internetconnected: boolean; implementation
{================================================================= 功 能: 检测机器是否登入网络 参 数: 无 返回值: 成功: true 失败: false 备 注: 版 本: 1.0 2002/10/03 09:55:00 =================================================================} function checkmacattachnet: boolean; begin result := false; if getsystemmetrics(sm_network) <> 0 then result := true; end;
{================================================================= 功 能: 返回本机的局域网ip地址 参 数: 无 返回值: 成功: true, 并填充localip 失败: false 备 注: 版 本: 1.0 2002/10/02 21:05:00 =================================================================} function getlocalip(var localip: string): boolean; var hostent: phostent; ip: string; addr: pchar; buffer: array [0..63] of char; ginitdata: twsadata; begin result := false; try wsastartup(2, ginitdata); gethostname(buffer, sizeof(buffer)); hostent := gethostbyname(buffer); if hostent = nil then exit; addr := hostent^.h_addr_list^; ip := format(''%d.%d.%d.%d'', [byte(addr [0]), byte (addr [1]), byte (addr [2]), byte (addr [3])]); localip := ip; result := true; finally wsacleanup; end; end;
{================================================================= 功 能: 通过ip返回机器名 参 数: ipaddr: 想要得到名字的ip 返回值: 成功: 机器名 失败: '''' 备 注: inet_addr function converts a string containing an internet protocol dotted address into an in_addr. 版 本: 1.0 2002/10/02 22:09:00 =================================================================} function getnamebyipaddr(ipaddr : string;var macname:string): boolean; var sockaddrin: tsockaddrin; hostent: phostent; wsadata: twsadata; begin result := false; if ipaddr = '''' then exit; try wsastartup(2, wsadata); sockaddrin.sin_addr.s_addr := inet_addr(pchar(ipaddr)); hostent := gethostbyaddr(@sockaddrin.sin_addr.s_addr, 4, af_inet); if hostent <> nil then macname := strpas(hostent^.h_name); result := true; finally wsacleanup; end; end;
{================================================================= 功 能: 返回网络中sqlserver列表 参 数: list: 需要填充的list 返回值: 成功: true,并填充list 失败 false 备 注: 版 本: 1.0 2002/10/02 22:44:00 =================================================================} function getsqlserverlist(var list: tstringlist): boolean; var i: integer; sretvalue: string; sqlserver: variant; serverlist: variant; begin result := false; list.clear; try sqlserver := createoleobject(''sqldmo.application''); serverlist := sqlserver.listavailablesqlservers; for i := 1 to serverlist.count do list.add (serverlist.item(i)); result := true; finally sqlserver := null; serverlist := null; end; end;
{================================================================= 功 能: 判断ip协议有没有安装 参 数: 无 返回值: 成功: true 失败: false; 备 注: 该函数还有问题 版 本: 1.0 2002/10/02 21:05:00 =================================================================} function isipinstalled : boolean; var wsdata: twsadata; protoent: pprotoent; begin result := true; try if wsastartup(2,wsdata) = 0 then begin protoent := getprotobyname(''ip''); if protoent = nil then result := false end; finally wsacleanup; end; end;
{================================================================= 功 能: 返回网络中的共享资源 参 数: ipaddr: 机器ip list: 需要填充的list 返回值: 成功: true,并填充list 失败: false; 备 注: wnetopenenum function starts an enumeration of network resources or existing connections. wnetenumresource function continues a network-resource enumeration started by the wnetopenenum function. 版 本: 1.0 2002/10/03 07:30:00 =================================================================} function getuserresource(ipaddr: string; var list: tstringlist): boolean; type tnetresourcearray = ^tnetresource;//网络类型的数组 var i: integer; buf: pointer; temp: tnetresourcearray; lphenum: thandle; netresource: tnetresource; count,bufsize,res: dword; begin result := false; list.clear; if copy(ipaddr,0,2) <> ''\\'' then ipaddr := ''\\''+ipaddr; //填充ip地址信息 fillchar(netresource, sizeof(netresource), 0);//初始化网络层次信息 netresource.lpremotename := @ipaddr[1];//指定计算机名称 //获取指定计算机的网络资源句柄 res := wnetopenenum( resource_globalnet, resourcetype_any, resourceusage_connectable, @netresource,lphenum); if res <> no_error then exit;//执行失败 while true do//列举指定工作组的网络资源 begin count := $ffffffff;//不限资源数目 bufsize := 8192;//缓冲区大小设置为8k getmem(buf, bufsize);//申请内存,用于获取工作组信息 //获取指定计算机的网络资源名称 res := wnetenumresource(lphenum, count, pointer(buf), bufsize); if res = error_no_more_items then break;//资源列举完毕 if (res <> no_error) then exit;//执行失败 temp := tnetresourcearray(buf); for i := 0 to count - 1 do begin //获取指定计算机中的共享资源名称,+2表示删除"\\", //如http://www.cnblogs.com/wangdaye/admin/file://192.168.0.1/ => 192.168.0.1 list.add(temp^.lpremotename + 2); inc(temp); end; end; res := wnetcloseenum(lphenum);//关闭一次列举 if res <> no_error then exit;//执行失败 result := true; freemem(buf); end;
{================================================================= 功 能: 返回网络中的工作组 参 数: list: 需要填充的list 返回值: 成功: true,并填充list 失败: false; 备 注: 版 本: 1.0 2002/10/03 08:00:00 =================================================================} function getgrouplist( var list : tstringlist ) : boolean; type tnetresourcearray = ^tnetresource;//网络类型的数组 var netresource: tnetresource; buf: pointer; count,bufsize,res: dword; lphenum: thandle; p: tnetresourcearray; i,j: smallint; networktypelist: tlist; begin result := false; networktypelist := tlist.create; list.clear; //获取整个网络中的文件资源的句柄,lphenum为返回名柄 res := wnetopenenum( resource_globalnet, resourcetype_disk, resourceusage_container, nil,lphenum); if res <> no_error then exit;//raise exception(res);//执行失败 //获取整个网络中的网络类型信息 count := $ffffffff;//不限资源数目 bufsize := 8192;//缓冲区大小设置为8k getmem(buf, bufsize);//申请内存,用于获取工作组信息 res := wnetenumresource(lphenum, count, pointer(buf), bufsize); //资源列举完毕 //执行失败 if ( res = error_no_more_items ) or (res <> no_error ) then exit; p := tnetresourcearray(buf); for i := 0 to count - 1 do//记录各个网络类型的信息 begin networktypelist.add(p); inc(p); end; res := wnetcloseenum(lphenum);//关闭一次列举 if res <> no_error then exit; for j := 0 to networktypelist.count-1 do //列出各个网络类型中的所有工作组名称 begin//列出一个网络类型中的所有工作组名称 netresource := tnetresource(networktypelist.items[j]^);//网络类型信息 //获取某个网络类型的文件资源的句柄,netresource为网络类型信息,lphenum为返回名柄 res := wnetopenenum(resource_globalnet, resourcetype_disk, resourceusage_container, @netresource,lphenum); if res <> no_error then break;//执行失败 while true do//列举一个网络类型的所有工作组的信息 begin count := $ffffffff;//不限资源数目 bufsize := 8192;//缓冲区大小设置为8k getmem(buf, bufsize);//申请内存,用于获取工作组信息 //获取一个网络类型的文件资源信息, res := wnetenumresource(lphenum, count, pointer(buf), bufsize); //资源列举完毕 //执行失败 if ( res = error_no_more_items ) or (res <> no_error) then break; p := tnetresourcearray(buf); for i := 0 to count - 1 do//列举各个工作组的信息 begin list.add( strpas( p^.lpremotename ));//取得一个工作组的名称 inc(p); end; end; res := wnetcloseenum(lphenum);//关闭一次列举 if res <> no_error then break;//执行失败 end; result := true; freemem(buf); networktypelist.destroy; end;
{================================================================= 功 能: 列举工作组中所有的计算机 参 数: list: 需要填充的list 返回值: 成功: true,并填充list 失败: false; 备 注: 版 本: 1.0 2002/10/03 08:00:00 =================================================================} function getusers(groupname: string; var list: tstringlist): boolean; type tnetresourcearray = ^tnetresource;//网络类型的数组 var i: integer; buf: pointer; temp: tnetresourcearray; lphenum: thandle; netresource: tnetresource; count,bufsize,res: dword; begin result := false; list.clear; fillchar(netresource, sizeof(netresource), 0);//初始化网络层次信息 netresource.lpremotename := @groupname[1];//指定工作组名称 netresource.dwdisplaytype := resourcedisplaytype_server;//类型为服务器(工作组) netresource.dwusage := resourceusage_container; netresource.dwscope := resourcetype_disk;//列举文件资源信息 //获取指定工作组的网络资源句柄 res := wnetopenenum( resource_globalnet, resourcetype_disk, resourceusage_container, @netresource,lphenum); if res <> no_error then exit; //执行失败 while true do//列举指定工作组的网络资源 begin count := $ffffffff;//不限资源数目 bufsize := 8192;//缓冲区大小设置为8k getmem(buf, bufsize);//申请内存,用于获取工作组信息 //获取计算机名称 res := wnetenumresource(lphenum, count, pointer(buf), bufsize); if res = error_no_more_items then break;//资源列举完毕 if (res <> no_error) then exit;//执行失败 temp := tnetresourcearray(buf); for i := 0 to count - 1 do//列举工作组的计算机名称 begin //获取工作组的计算机名称,+2表示删除"\\",如http://www.cnblogs.com/wangdaye/admin/file://wangfajun=%3ewangfajun/ list.add(temp^.lpremotename + 2); inc(temp); end; end; res := wnetcloseenum(lphenum);//关闭一次列举 if res <> no_error then exit;//执行失败 result := true; freemem(buf); end;
{================================================================= 功 能: 列举所有网络类型 参 数: list: 需要填充的list 返回值: 成功: true,并填充list 失败: false; 备 注: 版 本: 1.0 2002/10/03 08:54:00 =================================================================} function getnetlist(var list: tstringlist): boolean; type tnetresourcearray = ^tnetresource;//网络类型的数组 var p: tnetresourcearray; buf: pointer; i: smallint; lphenum: thandle; netresource: tnetresource; count,bufsize,res: dword; begin result := false; list.clear; res := wnetopenenum( resource_globalnet, resourcetype_disk, resourceusage_container, nil,lphenum); if res <> no_error then exit;//执行失败 count := $ffffffff;//不限资源数目 bufsize := 8192;//缓冲区大小设置为8k getmem(buf, bufsize);//申请内存,用于获取工作组信息 res := wnetenumresource(lphenum, count, pointer(buf), bufsize);//获取网络类型信息 //资源列举完毕 //执行失败 if ( res = error_no_more_items ) or (res <> no_error ) then exit; p := tnetresourcearra
{================================================================= 功 能: 映射网络驱动器 参 数: netpath: 想要映射的网络路径 password: 访问密码 localpath 本地路径 返回值: 成功: true 失败: false; 备 注: 版 本: 1.0 2002/10/03 09:24:00 =================================================================} function netaddconnection(netpath: pchar; password: pchar ;localpath: pchar): boolean; var res: dword; begin result := false; res := wnetaddconnection(netpath,password,localpath); if res <> no_error then exit; result := true; end;
{================================================================= 功 能: 检测网络状态 参 数: ipaddr: 被测试网络上主机的ip地址或名称,建议使用ip 返回值: 成功: true 失败: false; 备 注: 版 本: 1.0 2002/10/03 09:40:00 =================================================================} function checknet(ipaddr: string): boolean; type pipoptioninformation = ^tipoptioninformation; tipoptioninformation = packed record ttl: byte; // time to live (used for traceroute) tos: byte; // type of service (usually 0) flags: byte; // ip header flags (usually 0) optionssize: byte; // size of options data (usually 0, max 40) optionsdata: pchar; // options data buffer end;
picmpechoreply = ^ticmpechoreply; ticmpechoreply = packed record address: dword; // replying address status: dword; // ip status value (see below) rtt: dword; // round trip time in milliseconds datasize: word; // reply data size reserved: word; data: pointer; // pointer to reply data buffer options: tipoptioninformation; // reply options end;
ticmpcreatefile = function: thandle; stdcall; ticmpclosehandle = function(icmphandle: thandle): boolean; stdcall; ticmpsendecho = function( icmphandle: thandle; destinationaddress: dword; requestdata: pointer; requestsize: word; requestoptions: pipoptioninformation; replybuffer: pointer; replysize: dword; timeout: dword ): dword; stdcall;
const size = 32; timeout = 1000; var wsadata: twsadata; address: dword; // address of host to contact hostname, hostip: string; // name and dotted ip of host to contact phe: phostent; // hostentry buffer for name lookup buffersize, npkts: integer; preqdata, pdata: pointer; pipe: picmpechoreply; // icmp echo reply buffer ipopt: tipoptioninformation; // ip options for packet to send const icmpdll = ''icmp.dll''; var hicmplib: hmodule; icmpcreatefile : ticmpcreatefile; icmpclosehandle: ticmpclosehandle; icmpsendecho: ticmpsendecho; hicmp: thandle; // handle for the icmp calls begin // initialise winsock result:=true; if wsastartup(2,wsadata) <> 0 then begin result:=false; halt; end; // register the icmp.dll stuff hicmplib := loadlibrary(icmpdll); if hicmplib <> null then begin @icmpcreatefile := getprocaddress(hicmplib, ''icmpcreatefile''); @icmpclosehandle:= getprocaddress(hicmplib, ''icmpclosehandle''); @icmpsendecho:= getprocaddress(hicmplib, ''icmpsendecho''); if (@icmpcreatefile = nil) or (@icmpclosehandle = nil) or (@icmpsendecho = nil) then begin result:=false; halt; end; hicmp := icmpcreatefile; if hicmp = invalid_handle_value then begin result:=false; halt; end; end else begin result:=false; halt; end; // ------------------------------------------------------------ address := inet_addr(pchar(ipaddr)); if (address = inaddr_none) then begin phe := gethostbyname(pchar(ipaddr)); if phe = nil then result:=false else begin address := longint(plongint(phe^.h_addr_list^)^); hostname := phe^.h_name; hostip := strpas(inet_ntoa(tinaddr(address))); end; end else begin phe := gethostbyaddr(@address, 4, pf_inet); if phe = nil then result:=false; end;
if address = inaddr_none then begin result:=false; end; // get some data buffer space and put something in the packet to send buffersize := sizeof(ticmpechoreply) + size; getmem(preqdata, size); getmem(pdata, size); getmem(pipe, buffersize); fillchar(preqdata^, size, $aa); pipe^.data := pdata;
// finally send the packet fillchar(ipopt, sizeof(ipopt), 0); ipopt.ttl := 64; npkts := icmpsendecho(hicmp, address, preqdata, size, @ipopt, pipe, buffersize, timeout); if npkts = 0 then result:=false;
// free those buffers freemem(pipe); freemem(pdata); freemem(preqdata);
// -------------------------------------------------------------- icmpclosehandle(hicmp); freelibrary(hicmplib); // free winsock if wsacleanup <> 0 then result:=false; end;
{================================================================= 功 能: 检测计算机是否上网 参 数: 无 返回值: 成功: true 失败: false; 备 注: uses wininet 版 本: 1.0 2002/10/07 13:33:00 =================================================================} function internetconnected: boolean; const // local system uses a modem to connect to the internet. internet_connection_modem = 1; // local system uses a local area network to connect to the internet. internet_connection_lan = 2; // local system uses a proxy server to connect to the internet. internet_connection_proxy = 4; // local system''s modem is busy with a non-internet connection. internet_connection_modem_busy = 8; var dwconnectiontypes : dword; begin dwconnectiontypes := internet_connection_modem+ internet_connection_lan + internet_connection_proxy; result := internetgetconnectedstate(@dwconnectiontypes, 0); end;
end. //错误信息常量 unit head;
interface const c_err_getlocalip = ''获取本地ip失败''; c_err_getnamebyipaddr = ''获取主机名失败''; c_err_getsqlserverlist = ''获取sqlserver服务器失败''; c_err_getuserresource = ''获取共享资失败''; c_err_getgrouplist = ''获取所有工作组失败''; c_err_getgroupusers = ''获取工作组中所有计算机失败''; c_err_getnetlist = ''获取所有网络类型失败''; c_err_checknet = ''网络不通''; c_err_checkattachnet = ''未登入网络''; c_err_internetconnected =''没有上网'';
c_txt_checknetsuccess = ''网络畅通''; c_txt_checkattachnetsuccess = ''已登入网络''; c_txt_internetconnected =''上网了'';
implementation
end.
|
请发表评论