Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Трафик UDP ???


Автор: Олег_Игоревич 8.5.2005, 17:29
Доброго ВАМ времени суток, уважаемые!

Возник у меня такой вопрос :
как можно узнать кол-во входящего и исходящего трафика по протоколу UDP и другим , как , к примеру, в программе
OutPost Firewall ?
Заранее спасибо !!!

Автор: Rouse_ 9.5.2005, 10:47
Так пойдет?

Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    lblInDatagrams: TLabel;
    lbldwNoPorts: TLabel;
    lbldwInErrors: TLabel;
    lbldwOutDatagrams: TLabel;
    lbdwNumAddrs: TLabel;
    procedure Timer1Timer(Sender: TObject);
  end;

  PMibUdpStats = ^TMibUdpStats;
  _MIB_UDPSTATS = packed record
    dwInDatagrams: DWORD;
    dwNoPorts: DWORD;
    dwInErrors: DWORD;
    dwOutDatagrams: DWORD;
    dwNumAddrs: DWORD;
  end;
  TMibUdpStats = _MIB_UDPSTATS;

  function GetUdpStatistics(var pStats: TMibUdpStats): DWORD;
    stdcall; external 'iphlpapi.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Stats: TMibUdpStats;
begin
  if GetUdpStatistics(Stats) = NO_ERROR then
  begin
    lblInDatagrams.Caption := IntToStr(Stats.dwInDatagrams);
    lbldwNoPorts.Caption := IntToStr(Stats.dwNoPorts);
    lbldwInErrors.Caption := IntToStr(Stats.dwInErrors);
    lbldwOutDatagrams.Caption := IntToStr(Stats.dwOutDatagrams);
    lbdwNumAddrs.Caption := IntToStr(Stats.dwNumAddrs);
  end;
end;

end.

Автор: Олег_Игоревич 10.5.2005, 21:13
Большое спасибо Rouse_ ! Всё понятно !!!

Автор: DB 17.11.2005, 12:27
Скажите, а как при этом узнать IP адреса входящего и исходящего соединения?
А также номера портов smile

Автор: Snowy 17.11.2005, 12:48
В данном примере никак. Тут статистика.
А статистика это обобщенные данные, а не по каждому соединени.
Тут нужно копать в сторону GetUDPTable или GetExtendedUdpTable.

Автор: DB 17.11.2005, 15:03
GetUDPTable не помогает
Про GetExtendedUdpTable инфу не нашел
может линки подкинете или подскажите как можно определить IP адрес удаленного соединения по UDP протоколу?

Заранее спасибо!!!

Автор: AntonSaburov 17.11.2005, 15:30
Открывать сокеты на уровне ROW_SOCKET. Тогда можно ловить весь траффик и делать с ним что хочешь.

Автор: Snowy 17.11.2005, 15:36
UDP протокол не содержит IP адреса.
Поэтому просто так никак.
Нужно ловить все подряд IP пакеты, а потом уже разбираться, UDP это или нет.

Автор: DB 18.11.2005, 08:35
Тогда как определить на какой порт пришел перехваченный IP пакет?

Автор: Snowy 18.11.2005, 09:46
А тут уже нужно вытаскивать из него UDP и смотреть в UDP.
Данные о портах там.

Автор: Guest 18.11.2005, 11:29
Подскажите пожалуйста как это реализовать
в состав пакета входит:
Код

версия и длина заголовка
тип сервиса
длина всего пакета
Идентификация
флаги и смещения
время жизни пакета
протокол
контрольная сумма
IP-адрес отправителя
IP-адрес назначения

Как вытащить из него UDP?

Автор: Romikgy 18.11.2005, 12:39
Цитата(Guest @ 18.11.2005, 11:29)
протокол

Здесь об этом написано smile
Добавлено @ 12:40
Возьми на посмотреть как работает простейший сниффер.

Автор: Snowy 18.11.2005, 12:53
Цитата(Guest @ 18.11.2005, 11:29)
Как вытащить из него UDP?

Это сложнее. Сам UDP пакет может быть разбит по нескольким IP пакетам.
Хотя, если тебе нужен только порт - нужно брать данные из тела IP пакета и разбирать, согласно заголовка UDP. Естественно, если тип данных в пакете UDP.

Автор: DB 18.11.2005, 13:36
А есть примерчик? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)