Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.015 c
4-63895
_sMile
2003-01-09 15:09
2003.02.20
Прозрачный фон у Static Text.


1-63598
a123
2003-02-11 08:48
2003.02.20
Переменную окружения USERPROFILE


9-63463
xMagicx
2002-08-05 19:24
2003.02.20
Изометрический движок


1-63625
denis24
2003-02-11 15:04
2003.02.20
выделение текста в определенной строке Richedit


3-63582
Step[B.M.]
2003-02-04 10:37
2003.02.20
Не могу в Blob-поле InterBase вставить BMP. Что не ТАК ?