Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get Netstat info through the Use of API's in delphi 7

Tags:

delphi

I have been given a task of finding the info abt n/w or, the info which is given by the netstat command in Windows. Now, I have been told to use some API for extracting that information. Any API which is available for delphi 7 for this task will be helpful. I have come across this API, the IP helper API , but i cannot find that in my PC. i could only find the DLL 'iphlpapi.dll' in C:\Windows\System32. Also, there seems to be very less information on how to use this particular API. Please help.

Thanks IN advance

P.S. Earlier i was doing the same by executing the Netstat command, writing the output to a text file, and then parsing the same for display, which for me, is a Perfectly fine approach. My sir however is not fine with it. What is the cause, i could not fathom.

like image 650
CyprUS Avatar asked Jul 16 '11 05:07

CyprUS


People also ask

How do I check my netstat?

Using Netstat command: Open a CMD prompt. Type in the command: netstat -ano -p tcp. You'll get an output similar to this one. Look-out for the TCP port in the Local Address list and note the corresponding PID number.

What information does the netstat tool display?

The netstat command generates displays that show network status and protocol statistics. You can display the status of TCP and UDP endpoints in table format, routing table information, and interface information. The most frequently used options for determining network status are: s , r , and i .

What command do you use to investigate ports?

Netstat, the TCP/IP networking utility, has a simple set of options and identifies a computer's listening ports, along with incoming and outgoing network connections.

Does netstat show all open ports?

You can use Netstat -b -a -o. This tool provides a list of all open ports and their associated processes. The -o shows the process id, which you can look up in your task manager or processes tab.


1 Answers

Check these windows functions GetTcpTable, GetUdpTable, GetExtendedTcpTable, GetExtendedUdpTable.

UPDATE

{$APPTYPE CONSOLE}

uses
  WinSock,
  Windows,
  SysUtils;

const
   ANY_SIZE = 1;
   iphlpapi = 'iphlpapi.dll';
   TCP_TABLE_OWNER_PID_ALL = 5;

   MIB_TCP_STATE:
   array[1..12] of string = ('CLOSED', 'LISTEN', 'SYN-SENT ','SYN-RECEIVED', 'ESTABLISHED', 'FIN-WAIT-1',
                             'FIN-WAIT-2', 'CLOSE-WAIT', 'CLOSING','LAST-ACK', 'TIME-WAIT', 'delete TCB');

type
  TCP_TABLE_CLASS = Integer;

  PMibTcpRowOwnerPid = ^TMibTcpRowOwnerPid;
  TMibTcpRowOwnerPid  = packed record
    dwState     : DWORD;
    dwLocalAddr : DWORD;
    dwLocalPort : DWORD;
    dwRemoteAddr: DWORD;
    dwRemotePort: DWORD;
    dwOwningPid : DWORD;
    end;

  PMIB_TCPTABLE_OWNER_PID  = ^MIB_TCPTABLE_OWNER_PID;
  MIB_TCPTABLE_OWNER_PID = packed record
   dwNumEntries: DWORD;
   table: Array [0..ANY_SIZE - 1] of TMibTcpRowOwnerPid;
  end;

var
   GetExtendedTcpTable:function  (pTcpTable: Pointer; dwSize: PDWORD; bOrder: BOOL; lAf: ULONG; TableClass: TCP_TABLE_CLASS; Reserved: ULONG): DWord; stdcall;

procedure ShowCurrentTCPConnections;
var
   Error      : DWORD;
   TableSize  : DWORD;
   i          : integer;
   IpAddress  : in_addr;
   RemoteIp   : string;
   LocalIp    : string;
   pTcpTable  : PMIB_TCPTABLE_OWNER_PID;
begin
  TableSize := 0;
  //Get the size o the tcp table
  Error := GetExtendedTcpTable(nil, @TableSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
  if Error <> ERROR_INSUFFICIENT_BUFFER then exit;

  //alocate the buffer
  GetMem(pTcpTable, TableSize);
  try
   Writeln(Format('%-16s %-6s %-16s %-6s %s',['Local IP','Port','Remote IP','Port','Status']));
   //get the tcp table data
   if GetExtendedTcpTable(pTcpTable, @TableSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) = NO_ERROR then
      for i := 0 to pTcpTable.dwNumEntries - 1 do
      begin
         IpAddress.s_addr := pTcpTable.Table[i].dwRemoteAddr;
         RemoteIp         := string(inet_ntoa(IpAddress));
         IpAddress.s_addr := pTcpTable.Table[i].dwLocalAddr;
         LocalIp          := string(inet_ntoa(IpAddress));
         Writeln(Format('%-16s %-6d %-16s %-6d %s',[LocalIp,pTcpTable.Table[i].dwLocalPort,RemoteIp,pTcpTable.Table[i].dwRemotePort,MIB_TCP_STATE[pTcpTable.Table[i].dwState]]));
      end;
  finally
     FreeMem(pTcpTable);
  end;
end;

var
   hModule : THandle;
begin
  try
    hModule             := LoadLibrary(iphlpapi);
    GetExtendedTcpTable := GetProcAddress(hModule, 'GetExtendedTcpTable');
    ShowCurrentTCPConnections;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
like image 66
RRUZ Avatar answered Oct 01 '22 11:10

RRUZ