求简单的稳定的获取本机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中
附代码最好,谢谢
------解决方案--------------------
/******************************************************
主题:提取机器名或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