Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetExtendedTcpTable в Windows 7 
:(
    Опции темы
Horus92
Дата 15.6.2010, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.6.2010

Репутация: нет
Всего: нет



Моя программа должна брать и выводить все значения TCP таблицы windows.Я использовал в сначала AllocateAndGetUdpExTableFromStack На XP всё работало перешел на Windows 7 и тут мне пишет
 
Цитата

Точка входа в процедуру AllocateAndGetUdpExTableFromStack не найдена в библиотеке DLL IPHLPAPI.DLL

Нашел мне надо использовать GetExtendedTCPTable попробовал
но почему-то при трассировке пишет Inaccesible value и в начале стоит проверка не равно ли оно NO_ERROR  и просто выходит из цикла, а если убрать проверку то выдает ошибку .
Вот мой код
Код

 if GetExtendedTcpTable(TCPExTable, Size, True) = NO_ERROR then
    begin
       Memo1.Lines.Add('');
      Memo1.Lines.Add('Extended TCP Stats');
      Memo1.Lines.Add(Format('%15s: | %5s | %-12s | %20s | (%s)', ['Host', 'Port', 'State']));
      Memo1.Lines.Add('==========================================================================');
      // начинаем выводить информацию
      for I := 0 to TCPExTable^.dwNumEntries - 1 do
        Memo1.Lines.Add(Format('%15s: | %5d | %-12s | %20s | (%d)',
          [inet_ntoa(in_addr(TCPExTable^.Table[I].dwLocalAddr)),
          htons(TCPExTable^.Table[I].dwLocalPort),
          PortStateToStr(TCPExTable^.Table[I].dwState)]));

          end;

Оригинал кода _http://rouse.drkb.ru/files/tcpstat.zip
Помогите решить проблему.
PM MAIL   Вверх
RomanEEP
Дата 15.6.2010, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 1
Всего: 8



Интересно, а для чего стояла проверка на NO_ERROR?
 Может быть можно что-то сделать с возвращаемым GetExtendedTcpTable значением? 
PM MAIL   Вверх
CodeMonkey
Дата 15.6.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



GetExtendedTcpTable Function:
Цитата
If the call is successful, the value NO_ERROR is returned.

If the function fails, the return value is one of the following error codes.

ERROR_INSUFFICIENT_BUFFER
An insufficient amount of space was allocated for the table. The size of the table is returned in the pdwSize parameter, and must be used in a subsequent call to this function in order to successfully retrieve the table. This error is also returned if the pTcpTable parameter is NULL.

ERROR_INVALID_PARAMETER
An invalid parameter was passed to the function. This error is returned if the TableClass parameter contains a value that is not defined in the TCP_TABLE_CLASS enumeration.



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Horus92
Дата 16.6.2010, 07:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.6.2010

Репутация: нет
Всего: нет



Вывел то код ошибки там записано 87.
PM MAIL   Вверх
CodeMonkey
Дата 16.6.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



А SysErrorMessage не судьба использовать?

87 - это ERROR_INVALID_PARAMETER.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Horus92
Дата 16.6.2010, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.6.2010

Репутация: нет
Всего: нет



А какой же параметр неверен?
PM MAIL   Вверх
CodeMonkey
Дата 16.6.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Почему бы вам не использовать голову?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Horus92
Дата 16.6.2010, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.6.2010

Репутация: нет
Всего: нет



К сожалению у меня небольшой опыт по системному программированию, поэтому я и написал тему на этом форуме чтобы люди с большим опытом помогли  мне в этом вопросе. Так как я не нашел ни одной реализации такого кода на win 7.
PM MAIL   Вверх
Rennigth
Дата 16.6.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Horus92, Как вообще вы скомпилировали это? Тамже должно быть больше параметров.
По ссылке на мсдн(которую дал ув. CodeMonkey) довольно подробно описывается как использовать эту функцию.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Rennigth
Дата 16.6.2010, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Horus92, для затравки (т.к. в семерке у меня ее нет) вот ее объявление для делфи:
Код

  PTCP_TABLE_CLASS = ^TCP_TABLE_CLASS;

  TCP_TABLE_CLASS =
    (TCP_TABLE_BASIC_LISTENER,
    TCP_TABLE_BASIC_CONNECTIONS,
    TCP_TABLE_BASIC_ALL,
    TCP_TABLE_OWNER_PID_LISTENER,
    TCP_TABLE_OWNER_PID_CONNECTIONS,
    TCP_TABLE_OWNER_PID_ALL,
    TCP_TABLE_OWNER_MODULE_LISTENER,
    TCP_TABLE_OWNER_MODULE_CONNECTIONS,
    TCP_TABLE_OWNER_MODULE_ALL);

type
  PVOID = Pointer;

function GetExtendedTcpTable(var pTcpTable: PVOID; var pdwSize: PDWORD;
  bOrder: BOOL; ulAf: ULONG; TableClass: TCP_TABLE_CLASS;
  Reserved: ULONG): DWORD; stdcall; external 'Iphlpapi.dll';




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
CodeMonkey
Дата 16.6.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Да причём тут 
Цитата(Horus92 @  16.6.2010,  16:07 Найти цитируемый пост)
небольшой опыт по системному программированию
.

От вас требуется лишь хотя бы минимально напрячь голову. Чтобы сообразить, что GetTcpTable <> GetExtendedTcpTable. У первой 3 параметра, у второй - 6. Я вам уж и так и этак намекал, но вы, видимо, ждёте, пока за вас код напишут.

А если вы совсем новичёк - так и постили бы в раздел новичков.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Rennigth
Дата 18.6.2010, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Вот в простенький пример использования.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WinSock, StdCtrls;

type
  TForm1 = class(TForm)
    mmo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  MIB_TCP_STATE_CLOSED = 1; //The TCP connection is in the CLOSED state that represents no connection state at all.
  MIB_TCP_STATE_LISTEN = 2; //The TCP connection is in the LISTEN state waiting for a connection request from any remote TCP and port.
  MIB_TCP_STATE_SYN_SENT = 3; //The TCP connection is in the SYN-SENT state waiting for a matching connection request after having sent a connection request (SYN packet).
  MIB_TCP_STATE_SYN_RCVD = 4; //The TCP connection is in the SYN-RECEIVED state waiting for a confirming connection request acknowledgment after having both received and sent a connection request (SYN packet).
  MIB_TCP_STATE_ESTAB = 5; //The TCP connection is in the ESTABLISHED state that represents an open connection, data received can be delivered to the user. This is the normal state for the data transfer phase of the TCP connection.
  MIB_TCP_STATE_FIN_WAIT1 = 6; //The TCP connection is FIN-WAIT-1 state waiting for a connection termination request from the remote TCP, or an acknowledgment of the connection termination request previously sent.
  MIB_TCP_STATE_FIN_WAIT2 = 7; //The TCP connection is FIN-WAIT-1 state waiting for a connection termination request from the remote TCP.
  MIB_TCP_STATE_CLOSE_WAIT = 8; //The TCP connection is in the CLOSE-WAIT state waiting for a connection termination request from the local user.
  MIB_TCP_STATE_CLOSING = 9; //The TCP connection is in the CLOSING state waiting for a connection termination request acknowledgment from the remote TCP.
  MIB_TCP_STATE_LAST_ACK = 10; //The TCP connection is in the LAST-ACK state waiting for an acknowledgment of the connection termination request previously sent to the remote TCP (which includes an acknowledgment of its connection termination request).
  MIB_TCP_STATE_TIME_WAIT = 11; //The TCP connection is in the TIME-WAIT state waiting for enough time to pass to be sure the remote TCP received the acknowledgment of its connection termination request.
  MIB_TCP_STATE_DELETE_TCB = 12;

type
  PTCP_TABLE_CLASS = ^TCP_TABLE_CLASS;
  TCP_TABLE_CLASS =
    (TCP_TABLE_BASIC_LISTENER,
    TCP_TABLE_BASIC_CONNECTIONS,
    TCP_TABLE_BASIC_ALL,
    TCP_TABLE_OWNER_PID_LISTENER,
    TCP_TABLE_OWNER_PID_CONNECTIONS,
    TCP_TABLE_OWNER_PID_ALL,
    TCP_TABLE_OWNER_MODULE_LISTENER,
    TCP_TABLE_OWNER_MODULE_CONNECTIONS,
    TCP_TABLE_OWNER_MODULE_ALL);

  PMIB_TCPROW = ^_MIB_TCPROW;
  _MIB_TCPROW = record
     dwState: DWORD;
     dwLocalAddr: DWORD;
     dwLocalPort: DWORD;
     dwRemoteAddr: DWORD;
     dwRemotePort: DWORD;
   end;

  PMIB_TCPTABLE = ^_MIB_TCPTABLE;
  _MIB_TCPTABLE = record
    dwNumEntries: DWORD;
    Table: array[0..0] of _MIB_TCPROW;
  end;


type
  PVOID = Pointer;

function GetExtendedTcpTable(pTcpTable: PVOID; pdwSize: PDWORD;
  bOrder: BOOL; ulAf: ULONG; TableClass: TCP_TABLE_CLASS;
  Reserved: ULONG): DWORD; stdcall; external 'Iphlpapi.dll';


var
  Form1: TForm1;

implementation

{$R *.dfm}

function StateToStateStr(State: DWORD): string;
begin
  Result := '';
  case State of
    MIB_TCP_STATE_CLOSED: Result := 'MIB_TCP_STATE_CLOSED';
    MIB_TCP_STATE_LISTEN: Result := 'MIB_TCP_STATE_LISTEN';
    MIB_TCP_STATE_SYN_SENT: Result := 'MIB_TCP_STATE_SYN_SENT';
    MIB_TCP_STATE_SYN_RCVD: Result := 'MIB_TCP_STATE_SYN_RCVD';
    MIB_TCP_STATE_ESTAB: Result := 'MIB_TCP_STATE_ESTAB';
    MIB_TCP_STATE_FIN_WAIT1: Result := 'MIB_TCP_STATE_FIN_WAIT1';
    MIB_TCP_STATE_FIN_WAIT2: Result := 'MIB_TCP_STATE_FIN_WAIT2';
    MIB_TCP_STATE_CLOSE_WAIT: Result := 'MIB_TCP_STATE_CLOSE_WAIT';
    MIB_TCP_STATE_CLOSING: Result := 'MIB_TCP_STATE_CLOSING';
    MIB_TCP_STATE_LAST_ACK: Result := 'MIB_TCP_STATE_LAST_ACK';
    MIB_TCP_STATE_TIME_WAIT: Result := 'MIB_TCP_STATE_TIME_WAIT';
    MIB_TCP_STATE_DELETE_TCB: Result := 'MIB_TCP_STATE_DELETE_TCB';
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  pTcpTable: PMIB_TCPTABLE;
  MIB_TCPROW: _MIB_TCPROW;
  dwSize: DWORD;
  Res: DWORD;
  i: Integer;
begin
  pTcpTable := nil;
  dwSize := 0;
  Res := GetExtendedTcpTable(pTcpTable, @dwSize, False, AF_INET,
    TCP_TABLE_BASIC_CONNECTIONS, 0);
  if Res = ERROR_INVALID_PARAMETER then
    raise Exception.Create('ERROR_INVALID_PARAMETER');
  if Res = ERROR_INSUFFICIENT_BUFFER then
  begin
    pTcpTable := GetMemory(dwSize);
    ZeroMemory(pTcpTable, dwSize);
    try
      if GetExtendedTcpTable(pTcpTable, @dwSize, False, AF_INET,
        TCP_TABLE_BASIC_CONNECTIONS, 0) = NO_ERROR then
      begin
        for i := 0 to pTcpTable^.dwNumEntries - 1 do
        begin
          MIB_TCPROW := pTcpTable^.Table[i];
          mmo1.Lines.Add(StateToStateStr(MIB_TCPROW.dwState) +
            ' State = ' + IntToStr(MIB_TCPROW.dwState) +
            ' LocalAddr = '  + inet_ntoa(in_addr(MIB_TCPROW.dwLocalAddr)) +
            ' LocalPort = '  + IntToStr(ntohs(MIB_TCPROW.dwLocalPort)) +
            ' RemoteAddr = ' + inet_ntoa(in_addr(MIB_TCPROW.dwRemoteAddr)) +
            ' RemotePort = ' + IntToStr(ntohs(MIB_TCPROW.dwRemotePort))
            );
        end;
      end;
    finally
      FreeMemory(pTcpTable);
    end
  end;
end;

end.



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Horus92
Дата 22.6.2010, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.6.2010

Репутация: нет
Всего: нет



Rennigth,Спасибо функция работает но почему-то выводит не всю информацию допустим ни одного LISTENING не выводит хотя они есть

Это сообщение отредактировал(а) Horus92 - 22.6.2010, 22:12
PM MAIL   Вверх
Rennigth
Дата 23.6.2010, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Horus92,  проект, выложи что у тебя есть, посмотрим.

Добавлено через 4 минуты и 59 секунд
Цитата(Horus92 @  22.6.2010,  20:50 Найти цитируемый пост)
не всю информацию допустим ни одного LISTENING

А какую тебе надо?  То что я показал, это просто пример работы с этой функцией. Слушалелей и не должна показывать. Ну загляни в msdn,  и подумай для чего флаг TCP_TABLE_BASIC_CONNECTIONS и на что его можно заменить.  smile 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Horus92
Дата 23.6.2010, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 15.6.2010

Репутация: нет
Всего: нет



Всё разобрался, спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.