求简单的稳定的获取本机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中
C/C++ code
$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
    unsignedinteger        version
    unsignedinteger         highversion 
    character        discription[257]
    character        systemstatus[129]
    unsignedinteger        maxsockets
    unsignedinteger        maxupddg
    string         vendorinfo
end type

type os_hostent from structure
    long        hname
    long        haliases
    integer        haddrtype
    integer        hlen
    long        haddrlist
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