Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
14-63845
БРР
2003-02-03 13:19
2003.02.20
Баня


7-63873
Status_I
2002-12-15 03:22
2003.02.20
Установка шрифта


4-63913
mbIkola
2003-01-09 15:13
2003.02.20
Подсккажите плиз, как связать окно с PopupMenu


14-63818
Сатир
2003-02-03 22:55
2003.02.20
Помогите с Юниксом


7-63876
SPIRIT
2002-12-18 19:59
2003.02.20
Уменьшить DESKTOP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский