Текущий архив: 2003.02.20;
Скачать: CL | DM;
Вниз
GetTcpTable Найти похожие ветки
← →
Spawn (2002-11-30 08:45) [0]Подскжите пожалуийста, как правильно проэкспортировать функцию GetTcpTable. Я пробовал разобраться на другом форуме, в результате она не стала выдавать ошибку, но все еще неверно работает:
Вот ее описание и импорт:
функция GetTcpTable предназначена для получении информации о таблице TCP-соединений(описание на C):
DWORD GetTcpTable(
PMIB_TCPTABLE pTcpTable,
PDWORD pdwSize,
BOOL bOrder
);
Параметр pTcpTable - указатель на буфер MIB_TCPTABLE, в который будет помещена информация о TCP-соединениях. Параметр pwdSize - указатель на переменную, задающую размер буфера. Если размер буфкра не достаточно большой, то функция передаст в этом параметре требуемый размер. Параметр bOrder указывает, нужно ли сортировать информацию.
///////////////////////////////////////////////////////////////////
Я описал так:
function GetTcpTable(TcpTable:PMIB_TCPTABLE;Size:PChar;bOrder:Boolean):LongWord;stdcall;
///////////////////////////////////////////////////////////////////
Возвращаемая структура MIB_TCPTABLE имеет вид:
typedef struct _MIB_TCPTABLE
{
DWORD dwNumEntries;
MIB_TCPROW table[ANY_SIZE];
} MIB_TCPTABLE, *PMIB_TCPTABLE;
Она содержит следующие поля:
dwNumEntries - количество строк в поле table;
table - указатель на массив структур типа MIB_TCPROW, содержащих информацию о TCP-соединениях.
////////////////////////////////////////
Я описал так:
PMIB_TCPTABLE=^TMIB_TCPTABLE;
TMIB_TCPTABLE= record
dwNumEntries:LongWord;
table:array of PMIB_TCPROW;
end;
////////////////////////////////////////
Структура MIB_TCPROW содержит информацию о парах IP-адресов, образующих соединение:
typedef struct _MIB_TCPROW
{
DWORD dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
} MIB_TCPROW, *PMIB_TCPROW;
эта структура содержит следующие поля;
dwState - состояние данного TCP-соединения.
dwLocalAddr - локальный IP-адрес данного соединения;
dwLocalPort - локальный порт данного соединения;
dwRemoteAddr - внешний IP-адрес данного соединения;
dwRemotePort - внешний порт данного соединения;
////////////////////////////////////////
я описал так:
PMIB_TCPROW=^TMIB_TCPROW;
TMIB_TCPROW=record
dwState:LongWord;
dwLocalAddr:LongWord;
dwLocalPort:LongWord;
dwRemoteAddr:LongWord;
dwRemotePort:LongWord;
end;
////////////////////////////////////////
импорт:
function GetTcpTable(TcpTable:TMIB_TCPTABLE;Size:PChar;bOrder:Boolean):LongWord;stdcall;external "Iphlpapi.dll" name "GetTcpTable";
На другом форуме были 2 версии:
1)
TMIB_TCPTABLE=record
dwNumEntries:LongWord;
table:array of TMIB_TCPROW;
end;
var
m:PMIB_TCPTABLE;
ps:PDWord;
begin
try
New(m);
SetLength(m^.table,64);
New(ps);
ps^:=SizeOf(TMIB_TCPTABLE);
GetTcpTable(m,ps,False);
ShowMessage(IntToStr(m^.table[0].dwState));
finally
Dispose(ps);
SetLength(m^.table,0);
Dispose(m);
end;
в таком случае возвращаемые значения равны 0;
2)
TMIB_TCPTABLE=record
dwNumEntries:LongWord;
table:array of PMIB_TCPROW;
end;
var
m:PMIB_TCPTABLE;
ps:PDWord;
begin
try
New(m);
GetMem(m^.table,SizeOf(TMIB_TCPROW)*64);
New(ps);
ps^:=SizeOf(TMIB_TCPTABLE);
GetTcpTable(m,ps,False);
ShowMessage(IntToStr(m^.table[0].dwState));
finally
Dispose(ps);
FreeMem(m^.table);
Dispose(m);
end;
В этом случае результат возвращается, но только для 0-го элемента массива(для всех других возникает Access Violetion). Причем результат для 0-го элемента массива возвращается неверный. Может его надо както преобразовать?
Так же я нашел код на "С"(привожу его часть для получения TCP-таблицы):
Вот я нашел код на "С":
// Get the table of TCP endpoints
//
dwSize = 0;
error = GetTcpTable( NULL, &dwSize, TRUE );
if( error != ERROR_INSUFFICIENT_BUFFER ) {
printf("Failed to snapshot TCP endpoints.\n");
PrintError( error );
return -1;
}
tcpTable = (PMIB_TCPTABLE) malloc( dwSize );
error = GetTcpTable( tcpTable, &dwSize, TRUE );
if( error ) {
printf("Failed to snapshot TCP endpoints.\n");
PrintError( error );
return -1;
}
Пожалуйста, кто нибудь подскажите ошибку при вызове функции или какие нить недочеты, которые я допустил
← →
Spawn (2002-11-30 08:48) [1]Ненашел кнопки редактирования, так что вношу поправку:
Я описал так:
function GetTcpTable(TcpTable:PMIB_TCPTABLE;Size:PDWord;bOrder:Boolean):LongWord;stdcall;
и не экспорт, а импорт(постоянно путаю))))
← →
Spawn (2002-11-30 08:49) [2]Где PDWord:
type
PDWord=^Longword;
← →
Набережных С. (2002-11-30 10:11) [3]TMIB_TCPROW=record
dwState:LongWord;
dwLocalAddr:LongWord;
dwLocalPort:LongWord;
dwRemoteAddr:LongWord;
dwRemotePort:LongWord;
end;
PMIB_TCPTABLE=^TMIB_TCPTABLE;
TMIB_TCPTABLE= record
dwNumEntries:LongWord;
table:array[0..0] of TMIB_TCPROW;
end;
function GetTcpTable(var TcpTable:TMIB_TCPTABLE; var Size:DWORD; bOrder:Bool):LongWord;stdcall;
← →
Eugenex (2002-12-02 19:18) [4]И это заработало???????
Взял приведенный код - таже ошибка, данные отсутствуют!(
Пробую на другой функции, теже цифры, это какие биты из памяти, совершенно не по теме.
А это как: table: array[0..0] of TMIB_TCPROW; ???
Ну кто еще боролся с IPHLPAPI ???
try
New(m1);
GetMem(m1^.table, SizeOf(TMIB_IPNETROW)*64);
New(ps1);
ps1^:=SizeOf(TMIB_IPNETTABLE);
IF GetIpNetTable(m1, ps1, True) <> NO_ERROR then ListBox1.Items.Add("IpNetTable Ok");
ListBox1.Items.Add(IntToStr(m1^.dwNumEntries));
ListBox1.Items.Add(IntToStr(m1^.table[0].dwIndex));
ListBox1.Items.Add(IntToStr(m1^.table[0].dwPhysAddrLen));
ListBox1.Items.Add(IntToStr(m1^.table[0].dwAddr));
ListBox1.Items.Add(IntToStr(m1^.table[0].dwType));
finally
Dispose(ps1);
FreeMem(m1^.table);
Dispose(m1);
end;
← →
Набережных С. (2002-12-02 20:42) [5]>Eugenex (02.12.02 19:18)
А оно тебе надо? Что-то я сомневаюсь.
var
pMibTable:PMIB_TCPTABLE;
Sz:DWord;
Entries:integer;
Res:DWORD;
begin
{$R-}
Entries:=16;
Sz:=SizeOf(TMIB_TCPTABLE)+SizeOf(TMIB_TCPROW)*(Entries-1);
pMibTable:=nil;
try
repeat
ReallocMem(pMibTable,Sz);
Res:=GetTcpTable(pMibTable^,Sz,False);
until Res <> ERROR_INSUFFICIENT_BUFFER;
if Res <> NO_ERROR then
begin
ShowMessage(SysErrorMessage(Res));
exit;
end;
for Entries:=0 to pMibTable.dwNumEntries-1 do
ShowMessage(IntToStr(pMibTable.table[Entries].dwState));
finally
FreeMem(pMibTable);
end;
{$R+}
end;
← →
Polevi (2002-12-03 10:55) [6]program gate;
{$APPTYPE CONSOLE}
uses
SysUtils,Windows, Classes, Winsock;
type
TIPFORWARDROWSTRUCT=record
dwForwardDest:DWORD;
dwForwardmask:DWORD;
dwForwardPolicy:DWORD;
dwForwardNextHop:DWORD;
dwForwardIfIndex:DWORD;
dwForwardType:DWORD;
dwForwardProto:DWORD;
dwForwardAge:DWORD;
dwForwardNextHopAS:DWORD;
dwForwardMetric1:DWORD;
dwForwardMetric2:DWORD;
dwForwardMetric3:DWORD;
dwForwardMetric4:DWORD;
dwForwardMetric5:DWORD;
end;
PIPFORWARDROWSTRUCT=^TIPFORWARDROWSTRUCT;
function GetIpForwardTable(ipForwardTable:Pointer;dwSize:PDWORD;order:boolean):DWORD;stdcall;external "iphlpapi.dll";
procedure PrintGates;
var
buffer:Pointer;
bufSize:DWORD;
ifr:PIPFORWARDROWSTRUCT;
entries,i:DWORD;
begin
bufSize:=0;
GetIpForwardTable(nil,@bufSize,false);
GetMem(buffer,bufSize);
try
GetIpForwardTable(buffer,@bufSize,false);
entries:=DWORD(buffer^);
ifr:=PIPFORWARDROWSTRUCT(Integer(buffer)+sizeof(DWORD));
for i:=0 to entries-1 do
begin
Writeln(inet_ntoa(TInAddr(ifr.dwForwardNextHop)));
ifr:=PIPFORWARDROWSTRUCT(Integer(ifr)+sizeof(TIPFORWARDROWSTRUCT));
end;
finally
FreeMem(buffer);
end;
end;
var
WSAData:TWSAData;
begin
WSAStartup($0202,WSAData);
PrintGates;
WSACleanup;
Readln;
end.
← →
Eugenex (2002-12-03 12:01) [7]Набережных С:
может и не надо.) Пока не рулит потому и не знаю.
ARP cache ловлю.
Кинул бы пример GetTCPTable на мыло, чтобы я форум не постил?
А то эти отрывки пока соберешь, какую небудь багу вставишь и крутишся на месте.
← →
Spawn (2002-12-30 14:08) [8]Набережных С. огромное тебе спасибо))) РЕСПЕКТ просто.
Страницы: 1 вся ветка
Текущий архив: 2003.02.20;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.006 c