hur.cn - 华软网

 热门搜索

在pb程序当中如何测试网络连接?

  作者:未知    来源:网络    更新时间:2017/9/26
我是想实现在pb程序中得知网络连接是否正常(是否连通网络中的另外一台机器,相当于在dos下的ping命令),如果正常那么执行下面程序,如果连接不正常另行处理。不知道在pb程序中语句该怎么些?
------华软网友回答------
反映不能下例子,所以转例子的代码


//声明全局变量global var


string password_,password_hcy=""
long dw_address
dec  dj[]
Constant String ver_old="2K3.11(20)"

//声明全局外部函数global ext fun
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" 


//声明结构
1、type icmp_echo_reply from structure
unsignedlong address
unsignedlong status
unsignedlong roundtriptime
unsignedlong datasize
unsignedlong reserved
unsignedlong datapointer
icmp_options options
string data

2、icmp_options from structure
character Ttl
character Tos
character Flags
character OptionsSize
character OptionsData


//函数,f_isipaddress 

        /*----------------------
        功能:判断是否IP有效地址
        传入:string f_p_address
        返回:boolean
        ------------------------*/
string a_s[16],as_1[4]

int a_dot[3]

int i,j

j=1

for i=1 to 16 

a_s[i]=mid(f_p_address,i,1)

if  a_s[i]="." then

a_dot[j]=i

j++

end if

next

if j<>4 then return false

if a_dot[2]=a_dot[1]+1 or a_dot[3]=a_dot[2]+1 then

return false

end if

for i=1 to a_dot[1] - 1

as_1[1]=as_1[1]+a_s[i]

next

for i=a_dot[1]+1 to a_dot[2] - 1

as_1[2]=as_1[2]+a_s[i]

next

for i=a_dot[2]+1 to a_dot[3] - 1

as_1[3]=as_1[3]+a_s[i]

next

for i=a_dot[3]+1 to 16

as_1[4]=as_1[4]+a_s[i]

next

for i=1 to 4

if long(as_1[i])>255 or long(as_1[i])<0 then 

return false

exit

end if

next



dw_address=long(as_1[4])*16777216+long(as_1[3])*65536+long(as_1[2])*256+long(as_1[1])


return true

--------------------------------------------------------------------------
函数f_ping
        /*----------------------
        功能:pingIP有效地址
        传入:string u_ipaddress
        返回:无
        ------------------------*/

if f_isipaddress(u_ipaddress) then

else
setprofilestring("ping.ini","properties","result","Ping Failure") 
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
dw_address=long(u_ipaddress)
rtn=IcmpSendEcho(l_hPort,dw_address,s_DataToSend,strlen,0,echo,56,200)
if rtn=1 then
//messagebox("Hello","Ping successful")
setprofilestring("ping.ini","properties","result","Ping Successful") 

setprofilestring("ping.ini","properties","flag","1") 

else

setprofilestring("ping.ini","properties","result","Ping Failure") 

setprofilestring("ping.ini","properties","flag","1") 

end if
long l_rtn
l_rtn=IcmpCloseHandle(l_hPort)

dw_address=0

// 窗口实例子变量:int return_b
// open事件
   Timer(0.5)

//Timer事件
timer(0)
idle(1)
//SQLCA.DBMS = "O73 ORACLE 7.3"
//SQLCA.LogPass = "zxcvbn"
//SQLCA.ServerName = "@mybzk"
//SQLCA.LogId = "bzk22"
//SQLCA.AutoCommit = False
//SQLCA.DBParm = "CommitOnDisconnect='NO'"

label1:
f_ping(STRING(f_ipaddressany('192.168.1.1')))
if ProfileString("ping.INI", "properties", "Result","None")="Ping Successful" then  
   //CONNECT USING SQLCA;
   //if sqlca.sqlcode<>0 then
   //   messagebox("错误","能连通指定的IP地址,但远程服务器未提供数据服务~r~n"+sqlca.sqlerrtext+"~r~n~r~n远程服务器未启动或网络配置问题",StopSign!,RetryCancel!)
   //   HALT close
   //else
    w_logo.height=1593
      sle_1.setfocus()
   //end if
else
return_b=messagebox("错误","与中实运业IP地址通迅失败~r~n原因:①远程服务器关机~r~n   ②网络太忙,稍后再试~r~n   ③网络中断",StopSign!,RetryCancel!)
   choose case return_b
    case 1
    goto label1
   case 2
         HALT close
   end choose
end if

----屏蔽的代码是连接数据库代码,自己适当修改

------华软网友回复------
你这个是检查IP地址的拼写是否有效,而没有测试IP地址是否通啊!你的程序关键的地方没有写程序。
if f_isipaddress(u_ipaddress) then
*在这个步骤怎么处理???
else
setprofilestring("ping.ini","properties","result","Ping Failure") 
end if
------华软网友回复------
f_ping(STRING(f_ipaddressany('192.168.1.1')))
------华软网友回复------
不过,确实漏了一函数,不过不是PING的函数

f_ipaddressany

//    传:string   f_p_address
//    返:long


string a_s[16],as_1[4]

int a_dot[3]

int i,j

j=1

for i=1 to 16 

a_s[i]=mid(f_p_address,i,1)

if  a_s[i]="." then

a_dot[j]=i

j++

end if

next

//if j<>4 then return false

if a_dot[2]=a_dot[1]+1 or a_dot[3]=a_dot[2]+1 then

//return false

end if

for i=1 to a_dot[1] - 1

as_1[1]=as_1[1]+a_s[i]

next

for i=a_dot[1]+1 to a_dot[2] - 1

as_1[2]=as_1[2]+a_s[i]

next

for i=a_dot[2]+1 to a_dot[3] - 1

as_1[3]=as_1[3]+a_s[i]

next

for i=a_dot[3]+1 to 16

as_1[4]=as_1[4]+a_s[i]

next

for i=1 to 4

if long(as_1[i])>255 or long(as_1[i])<0 then 

// return false

exit

end if

next
long ll_return

ll_return=long(as_1[4])*16777216+long(as_1[3])*65536+long(as_1[2])*256+long(as_1[1])

return ll_return
------华软网友回复------
收藏
------华软网友回复------
能否解释一下f_ipaddressany有什么用? 为什么要这样转换?
------华软网友回复------
呵呵,跑的真快
------华软网友回复------
如果要检测数据库的连接的话
可以用sqlca.dbhandle()
如果返回值大于零,就是数据库连接正常
------华软网友回复------
向狗狗兄學習啊
------华软网友回复------
to herrick :好像连接成功了返回的也是0
------华软网友回复------
不是啊,成功了返回的是个UnsignedLong型的数
不过不同数据库可能有差异,PB中定义的失败是返回负值
------华软网友回复------
呵呵~~,不是我写的代码,是返回长整型呀,
IP地址跟数据库没什么必然联系吧,


先转换成长整型(类似RGB值的转换,都不能超过255),再判断一次有没有带"."


------华软网友回复------
这个例子原本想实现的是先PING通,如果PING通则连接数据库
------华软网友回复------
to herrick:我连接的是sqlserver数据库,不管成不成功返回的都是0,我定义的就是UnsignedLong数据类型。

------华软网友回复------
题这个问题本来是出于这样的考虑:
connect using sqlca //如果远程数据库网络不通,这句语句将会耗费比较长的时间等待。所以考虑速度的问题,在连接之前现判断网络是否连通,如果连通则执行这句,不通则提示断网信息。
注:由于我用的是同城互联所以不得不考虑断网的情况出现。
------华软网友回复------
那要好好看你的代码了,要不然留信箱,

把例子发给你,我这里没啥问题
------华软网友回复------
mark      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。