PB程序中如何测试网络连接是否中断?(实现Ping命令)

使用connect using sqlca连接数据库,如果和服务器网络不通,会等待很长时间(大约30~60秒)
通过Windows自带的icmp.dll,可以对服务器进行Ping,在很短时间内即可判断网络是否连通。

我将网上的一个例子封装为类n_cst_ping,来简化调用过程。

forward  
global type n_cst_ping from nonvisualobject  
end type  
type icmp_options from structure within n_cst_ping  
end type  
type icmp_echo_reply from structure within n_cst_ping  
end type  
end forward  
type icmp_options from structure  
    character       Ttl  
    character       Tos  
    character       Flags  
    character       OptionsSize  
    character       OptionsData  
end type  
type icmp_echo_reply from structure  
    unsignedlong        address  
    unsignedlong        status  
    unsignedlong        roundtriptime  
    unsignedlong        datasize  
    unsignedlong        reserved  
    unsignedlong        datapointer  
    icmp_options        options  
    string      data  
end type  
global type n_cst_ping from nonvisualobject  
end type  
global n_cst_ping n_cst_ping  
type prototypes  
//声明外部函数  
function ulong CreateMutexA (ulong lpMutexAttributes, int bInitialOwner, ref string lpName) library "kernel32.dll"  
function ulong GetLastError () library "kernel32.dll"  
Function long IcmpCreateFile() Library"icmp.dll"  
Function long IcmpCloseHandle(ulong IcmpHandle)Library"icmp.dll"  
Function long IcmpSendEcho(ulong IcmpHandle1,ulong DesAddress,string requestdata,long datasize,ulong requestoption,ref ICMP_ECHO_REPLY replybuffer,ulong Replysize,ulong timeout)Library"icmp.dll"  
function int ShellAboutA( ulong al_hWnd, string as_szApp, string as_szOtherStuff, ulong hIcon ) library "shell32"  
end prototypes  
type variables  
string password_,password_hcy=""  
dec  dj[]  
Constant String ver_old="2K3.11(20)"  
end variables  
forward prototypes  
public function boolean of_ping (string as_ipaddress)  
public function long of_ipaddresstolong (string as_ipaddress)  
end prototypes  
public function boolean of_ping (string as_ipaddress);//Ping IP地址  
Long ll_Address  
//先转换  
ll_Address = of_IPAddressToLong(as_IPAddress)  
If (ll_Address = 0) then  
    MessageBox("提示", as_IPAddress + " 不是一个正确的IP地址", Exclamation!)  
    Return False  
End if  
long l_hPort  
string s_DataToSend  
long l_iOpt  
ICMP_ECHO_REPLY echo  
s_DataToSend="Send this characters"  
long strlen  
l_hport=0  
strlen=len(s_datatosend)  
l_hPort = IcmpCreateFile()  
long rtn  
rtn=0  
rtn=IcmpSendEcho(l_hPort,ll_Address,s_DataToSend,strlen,0,echo,56,200)  
//关闭通道  
long l_rtn  
l_rtn = IcmpCloseHandle(l_hPort)  
//返回结果  
Return (rtn = 1)  
end function  
public function long of_ipaddresstolong (string as_ipaddress);//将IP地址转为长整数  
Long ll_Block[4]  
String ls_Temp  
int i, j, p  
ls_Temp = as_IPAddress  
j = 1  
//先判断是否为有效IP地址  
p = Pos(ls_Temp, ".")  
Do While (p > 0)  
    ll_Block[j] = Long(Left(ls_Temp, p - 1))  
    ls_Temp = Mid(ls_Temp, p + 1)  

    j++  
    p = Pos(ls_Temp, ".")  
Loop  
If (Trim(ls_Temp) <> "") Then  
    ll_Block[j] = Long(Trim(ls_Temp))  
End If  
If (j <> 4) Then Return 0  
For i = 1 to 4  
    If (ll_Block[i] > 255) or (ll_Block[i] < 0) then  
        Return 0  
    End if  
Next  
Return ll_Block[4] * 16777216 + ll_Block[3] * 65536 + ll_Block[2] * 256 + ll_Block[1]  
end function  
on n_cst_ping.create  
call super::create  
TriggerEvent( this, "constructor" )  
end on  
on n_cst_ping.destroy  
TriggerEvent( this, "destructor" )  
call super::destroy  
end on  

调用方式:


n_cst_Ping Ping  
Ping = Create n_cst_Ping   
If Ping.of_Ping(ls_ip_address) then   
    //Messagebox("成功","能连通指定的IP地址。")  
Else  
    Messagebox("错误","无法连通指定的IP地址:" + ls_ip_address + ",原因:~r~n  ①远程服务器关机~r~n  ②网络太忙,稍后再试~r~n  ③网络中断", StopSign!)  
End if  
Destroy Ping  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值