*************************************************
*... FUNCTION gethostbyaddrfn
*
* Gets computer name using IP address
*
* Usage:
* SET PROCEDURE TO gethostbyaddrfn
* cCompName = gethostbyaddrfn("127.0.0.1")
*************************************************
PARAMETERS szaddr
STORE IIF(PARAMETERS() > 0, .T., .F.) TO lSingleIP &&... command line ip
DO DECL
IF NOT InitWinsock()
RETURN
ENDIF
#DEFINE AF_INET 2 && internetwork: UDP, TCP, etc.
LOCAL lnIP, lnHOSTENTptr, lcHOSTENT
IF At(',', szaddr) > 0
STORE Left(szaddr, At(',', szaddr) -1) TO xaddr
ELSE
STORE szaddr TO xaddr
ENDIF
lnIP = inet_addr(xaddr)
? "IP : " + xaddr
lnHOSTENTptr = gethostbyaddr(@lnIP, 4, AF_INET)
ipaddr = xaddr
IF lnHOSTENTptr = 0
?? " Not found: ", WSAGetLastError()
HOSTNAME = 'Not found'
ELSE
#DEFINE HOSTENT_SIZE 16
lcHOSTENT = GetMemBuf (lnHOSTENTptr, HOSTENT_SIZE)
?? " Host name:", GetMemStr(buf2dword(SUBSTR(lcHOSTENT, 1,4)))
HOSTNAME = GetMemStr(buf2dword(SUBSTR(lcHOSTENT, 1,4)))
ENDIF
* terminating use of the Ws2_32.dll
= WSACleanup()
RETURN HOSTNAME
FUNCTION InitWinsock()
* Initializing the Winsock service for the application
#DEFINE WSADATA_SIZE 398
#DEFINE WS_VERSION 514 && 0x0202
LOCAL lcWSADATAln, lnInitResult
lcWSADATA = REPLI(CHR(0), WSADATA_SIZE)
lnInitResult = WSAStartup (WS_VERSION, @lcWSADATA)
RETURN (lnInitResult = 0)
FUNCTION GetMemBuf (lnAddr, lnBufsize)
* returning data from a memory block
LOCAL lcBuffer
lcBuffer = REPLI(CHR(0), lnBufsize)
= Heap2Str (@lcBuffer, lnAddr, lnBufsize)
RETURN lcBuffer
FUNCTION GetMemStr (lnAddr)
* returning data from a memory block
* before the first occurence of a zero byte
LOCAL lcBuffer
lcBuffer = GetMemBuf (lnAddr, 250)
RETURN SUBSTR(lcBuffer, 1, AT(CHR(0),lcBuffer)-1)
FUNCTION buf2dword (lcBuffer)
RETURN ASC(SUBSTR(lcBuffer, 1,1)) + ;
ASC(SUBSTR(lcBuffer, 2,1)) * 256 +;
ASC(SUBSTR(lcBuffer, 3,1)) * 65536 +;
ASC(SUBSTR(lcBuffer, 4,1)) * 16777216
PROCEDURE DECL
DECLARE INTEGER WSAStartup IN ws2_32 INTEGER wVerRq, STRING @lpWSAData
DECLARE INTEGER WSACleanup IN ws2_32
DECLARE INTEGER WSAGetLastError IN ws2_32
DECLARE INTEGER gethostbyaddr IN ws2_32;
INTEGER @ADDR, INTEGER LEN, INTEGER TYPE
DECLARE RtlMoveMemory IN kernel32 AS Heap2Str;
STRING @DEST, INTEGER Src, INTEGER nLength
DECLARE INTEGER inet_addr IN ws2_32 STRING cp