DO declare
*| typedef struct _MIB_UDPTABLE {
*| DWORD dwNumEntries; // number of entries in the table
*| MIB_UDPROW table[ANY_SIZE]; // table of MIB_UDPROW structs
*| } MIB_UDPTABLE, *PMIB_UDPTABLE; total bytes = 4 + undef
*| typedef struct _MIB_UDPROW {
*| DWORD dwLocalAddr; // IP address on local computer
*| DWORD dwLocalPort; // port number on local computer
*| } MIB_UDPROW, *PMIB_UDPROW; total bytes = 8
#DEFINE MIB_UDPROW_SIZE 8
LOCAL cBuffer, nBufsize, nEntries, nIndex, cEntry
* call GetUdpTable with null buffer to get required size
nBufsize=0
= GetUdpTable(NULL, @nBufsize, 1)
cBuffer = Repli(Chr(0), nBufsize)
= GetUdpTable(@cBuffer, @nBufsize, 1)
* get number of entries in the table
nEntries = buf2dword(SUBSTR(cBuffer, 1,4))
* create resulting cursor
CREATE CURSOR cs (ipaddr C(15), port N(12))
* parse entries and save results in cursor
FOR nIndex = 1 TO nEntries
cEntry = SUBSTR(cBuffer,;
5 + (nIndex-1) * MIB_UDPROW_SIZE,;
MIB_UDPROW_SIZE)
= AddEntry(cEntry)
ENDFOR
GO TOP
BROW NORMAL NOWAIT
* end of main
PROCEDURE AddEntry(cEntry)
LOCAL lcIPAddr, lnPort
* local IP address and the host name
lcIPAddr = inet_ntoa(buf2dword(SUBSTR(cEntry, 1,4)))
* local port
lnPort = ntohs(buf2dword(SUBSTR(cEntry, 5,4)))
INSERT INTO cs VALUES (lcIPAddr, lnPort)
RETURN
FUNCTION buf2dword(cBuffer)
RETURN Asc(SUBSTR(cBuffer, 1,1)) + ;
Asc(SUBSTR(cBuffer, 2,1)) * 256 +;
Asc(SUBSTR(cBuffer, 3,1)) * 65536 +;
Asc(SUBSTR(cBuffer, 4,1)) * 16777216
PROCEDURE declare
DECLARE STRING inet_ntoa IN ws2_32 INTEGER in_addr
DECLARE INTEGER ntohs IN ws2_32 INTEGER netshort
DECLARE INTEGER GetUdpTable IN iphlpapi;
STRING @pUdpTable, INTEGER @pdwSize, INTEGER bOrder
|