首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > PB >

求简略的稳定的获取本机ip的方法

2012-12-31 
求简单的稳定的获取本机ip的方法附代码最好,谢谢[解决办法]/*******************************************

求简单的稳定的获取本机ip的方法
附代码最好,谢谢
[解决办法]
/****************************************************** 
主题:提取机器名或IP地址 
入参:name_ip   1为机器名、非1IP 
出参:机器名或IP 
调用: 
        function   int   WSAStartup(   uint   UIVersionRequested,   ref   s_WSAData   lpWSAData   )   library   "wsock32.dll " 
        function   int   WSACleanup()   library   "wsock32.dll " 
        function   int   WSAGetLastError   (   )   library   "wsock32.dll " 
        function   int   gethostname   (   ref   string   name,   int   namelen   )   library   "wsock32.dll " 
        function   string   GetHost(string   lpszhost,   ref   blob   lpszaddress   )   library   "pbws32.dll "   
*******************************************************/ 

s_wsadata l_WSAData 
string ls_HostName   =   space(128) 
string ls_IpAddress 
int li_version   =   257 
blob{4}   lb_hostaddress   
/*   Then,   create   a   session,   based   on   the   winsock   version.   This   version   number   consists   of   two   part,   a   major   and   minor   release   number,   both   represented   in   a   byte.   So,   version   1.1   gives   us   an   integer   version   of   257   (   256   +   1   )   */ 
IF   wsastartup   (   li_version,   l_WSAData   )   =   0   THEN 
/*   the   wsadata   structure   contains   several   information.   The   description   element   tells   us   the   winsock   version   */ 
//messagebox( "Winsock   Version ",   l_WSAData.description   ) 
/*   Now,   let 's   find   out   what   the   hostname   is   of   the   current   machine   we 're   working   on   */ 


IF   gethostname   (   ls_HostName,   len(ls_HostName)   )   <   0   THEN 
messagebox( "GetHostName ",WSAGetLastError()) 
ELSE 
/*   With   the   hostname,   call   the   DLL   function   and   map   the   IP-address   pointers   to   a   PB   blob   variable,   with   a   length   of   4   bytes.   This   is   done   because   the   internal   structure   contains   4   pointers,   each   pointer   point   to   one   of   the   parts   of   the   IP-address.   An   IP-address   namely,   consists   of   4   bytes   */ 
// Messagebox( "Hostname ",   ls_HostName) 
GetHost(ls_HostName,   lb_HostAddress) 
/*   Convert   the   pointers   to   scalars,   and   concatenate   them   to   one   string,   the   IP-address   */ 
ls_IpAddress   =   string(asc(string(blobmid(lb_HostAddress,1,1))), "000 ")   +   ". " 
ls_IpAddress   +=   string(asc(string(blobmid(lb_HostAddress,2,1))), "000 ")   +   ". " 
ls_IpAddress   +=   string(asc(string(blobmid(lb_HostAddress,3,1))), "000 ")   +   ". " 
ls_IpAddress   +=   string(asc(string(blobmid(lb_HostAddress,4,1))), "000 ") 
//Messagebox( "Ip   Address ",   ls_IpAddress   ) 
END   IF 
/*   We 're   finished,   clean   up   the   mess   we   made   */ 
WSACleanup() 
ELSE 
messagebox( "GetHostName ",WSAGetLastError()) 
END   IF   
if   name_ip=1   then 
return   ls_hostname 
else 
return   ls_ipaddress 
end   if


http://topic.csdn.net/t/20020711/09/865435.html
[解决办法]
将以下内容保存为本地文件n_cst_ip.sru
然后导入pbl中

$PBExportHeader$n_cst_ip.sru
forward
global type n_cst_ip from nonvisualobject
end type
type s_wsadata from structure within n_cst_ip
end type
type os_hostent from structure within n_cst_ip
end type
end forward

type s_wsadata from structure
unsignedintegerversion
unsignedinteger highversion 
characterdiscription[257]


charactersystemstatus[129]
unsignedintegermaxsockets
unsignedintegermaxupddg
string vendorinfo
end type

type os_hostent from structure
longhname
longhaliases
integerhaddrtype
integerhlen
longhaddrlist
end type

global type n_cst_ip from nonvisualobject autoinstantiate
end type

type prototypes
FUNCTION  int  WSAStartup(  uint  UIVersionRequested,  ref  s_WSAData  lpWSAData  )    library  "wsock32.dll" 
FUNCTION  int  WSACleanup()  library  "wsock32.dll"  
FUNCTION  int  gethostname  (  ref  blob  name,  int  namelen  )  library  "wsock32.dll"  
FUNCTION  uLong  gethostbyname(ref blob  sHost)  Library  "wsock32.dll"  
FUNCTION  uLong  RtlMoveMemory(ref  os_hostent  hpvDest,long  hpvSource,long  cbCopy)  Library  "kernel32.dll"  
FUNCTION  uLong  RtlMoveMemory(ref  uLong  hpvDest,long  hpvSource,long  cbCopy)  Library  "kernel32.dll" 
end prototypes
forward prototypes
public function boolean of_getlocaip (ref string as_ipadress[])
end prototypes

public function boolean of_getlocaip (ref string as_ipadress[]);//函  数:of_getlocaip()
//功  能:得到本机IP
//参  数:ref  string as_ipadress[] //ip数组
//返回值:Boolean True/False   
//创建人:李振军 2008.12.9
//修改人:

string ls_IpAddress[]
int li_IP_Count
string ls_ipmac
s_wsadata l_WSAData
string ls_HostName
ULong ll_addr, ll_IP, ll_ipaddr, ll_stringip  
int li_version = 257
int li_i, li_j
blob{128} lb_HostName
ulong ll_addr_list
os_hostent lstr_hostent
 
ls_ipmac = ""
if wsastartup(li_version, l_WSAData)  =  0 then

IF gethostname(lb_HostName, 128) < 0 THEN
//获取主机名失败
Return False
ELSE
li_j = len(lb_hostname)
ls_hostname = ""
For li_i = 1 To li_j
ls_hostname  =  ls_hostname + string(BlobMid(lb_hostname,  li_i,  1))
Next
ls_HostName  =  trim(ls_HostName)//主机名
ll_addr  =  gethostbyname(lb_HostName)
RtlMoveMemory(lstr_hostent, ll_addr, 16)
ll_addr_list  =  lstr_hostent.haddrlist
 
li_IP_Count  =  0 
Do While True  
RtlMoveMemory(ll_IPAddr, ll_addr_list, 4  )
If ll_IPAddr = 0 Then Exit  
li_IP_Count = li_IP_Count + 1
RtlMoveMemory(ll_StringIP,  ll_IPAddr, 1)
ls_IpAddress[li_IP_Count] = string(ll_StringIP) + "."
RtlMoveMemory(ll_StringIP, ll_IPAddr + 1, 1)
ls_IpAddress[li_IP_Count] = ls_IpAddress[li_IP_Count] + string(ll_StringIP) + "."
RtlMoveMemory(ll_StringIP, ll_IPAddr + 2, 1)
ls_IpAddress[li_IP_Count] = ls_IpAddress[li_IP_Count] + string(ll_StringIP)+ "."


RtlMoveMemory(ll_StringIP, ll_IPAddr + 3, 1)
ls_IpAddress[li_IP_Count] = ls_IpAddress[li_IP_Count] + string(ll_StringIP)
ll_addr_list = ll_addr_list + 4
Loop
End if
WSACleanup() 
End if

For li_i = 1 To li_IP_Count
 as_ipadress[li_i] = ls_IpAddress[li_i]
Next

return True
end function

on n_cst_ip.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_cst_ip.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on



使用时,方法如下:


热点排行