Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Объект на основе TIdConnectionIntercept


Страницы:   1 2

Hogo ©   (2003-06-03 12:17:00) 

У меня есть вот такой объект

TMyTraffic=class(TIdConnectionIntercept)
private
RecvBytes,
SentBytes,
CurrentAddonRecv,
CurrentAddonSent: integer;
public
ConnectionIp: string;
procedure DataReceived(var ABuffer; const AByteCount: integer); virtual;
procedure DataSent(var ABuffer; const AByteCount: integer); virtual;
...
end;

Это другие обекты

TrafficStat=class
private
stat: TList;
...
public
constructor create;
destructor destroy; override;
...
function AddConnection(IP: string;FromPort: integer): TMyTraffic;
...
end;

TTrafficStatItem=class(TrafficStat)
private
...
TrafficList: TList;
function UpdateTraffic: integer;
public
end;

TMyProxyList=class
private
...
ProxyList: TList;
...
private
procedure OnConnect(AThread: TIdPeerThread);
...
public
...
function UpdateTraffic(IP: string): integer;
...
constructor Create;
destructor Destroy; override;
end;

В событии OnConnect делаю следующее

NewTraffic:=TMyTraffic.Create(nil);
NewTraffic:=TraffStat.AddConnection(PeerIp, Port);
if NewTraffic<>nil then
begin
AThread.Connection.Intercept:=NewTraffic;
AThread.Connection.InterceptEnabled:=true;
NewTraffic.Free;

В AddConnection происходит вот это

...
NewTraffic:=TMyTraffic.Create(nil);
NewTraffic.ConnectionIp:=inttostr(FromPort);
item:=TTrafficStatItem.create;
Item:=Stat.Items[Index];
item.TrafficList:=TList.create;
item.TrafficList.Add(NewTraffic);
Stat.Items[Index]:=Item;
result:=NewTraffic;


Проблема в том что вот эти две процедуры не вызываются ваабще
вседствии чего трафик не считается, прокси работает, а трафик не считается.

procedure DataReceived(var ABuffer; const AByteCount: integer); virtual;
( var ABuffer; const AByteCount: integer)

У меня есть вот такой объект

TMyTraffic=class(TIdConnectionIntercept)
private
RecvBytes,
SentBytes,
CurrentAddonRecv,
CurrentAddonSent: integer;
public
ConnectionIp: string;
procedure DataReceived(var ABuffer; const AByteCount: integer); virtual;
procedure DataSent(var ABuffer; const AByteCount: integer); virtual;
...
end;

Это другие обекты

TrafficStat=class
private
stat: TList;
...
public
constructor create;
destructor destroy; override;
...
function AddConnection(IP: string;FromPort: integer): TMyTraffic;
...
end;

TTrafficStatItem=class(TrafficStat)
private
...
TrafficList: TList;
function UpdateTraffic: integer;
public
end;

TMyProxyList=class
private
...
ProxyList: TList;
...
private
procedure OnConnect(AThread: TIdPeerThread);
...
public
...
function UpdateTraffic(IP: string): integer;
...
constructor Create;
destructor Destroy; override;
end;

В событии OnConnect делаю следующее

NewTraffic:=TMyTraffic.Create(nil);
NewTraffic:=TraffStat.AddConnection(PeerIp, Port);
if NewTraffic<>nil then
begin
AThread.Connection.Intercept:=NewTraffic;
AThread.Connection.InterceptEnabled:=true;
NewTraffic.Free;

В AddConnection происходит вот это

...
NewTraffic:=TMyTraffic.Create(nil);
NewTraffic.ConnectionIp:=inttostr(FromPort);
item:=TTrafficStatItem.create;
Item:=Stat.Items[Index];
item.TrafficList:=TList.create;
item.TrafficList.Add(NewTraffic);
Stat.Items[Index]:=Item;
result:=NewTraffic;


Проблема в том что вот эти две процедуры не вызываются ваабще
вседствии чего трафик не считается, прокси работает, а трафик не считается.

procedure DataReceived(var ABuffer; const AByteCount: integer); virtual;
procedure DataSent(var ABuffer; const AByteCount: integer); virtual;



Событие OnConnect срабатывает.


Hogo   (2003-06-19 14:45:00) [1]

Ну override переписывает метод т.о. вызывается твой который ты написал, только надо не забыть вызвать из своей процедуры родительский обработчик, а то работать не будет.
Ну а free он видимо убивал этот интерцепт,
вроде бы на ранней стадии написания без free ошибку выдавал.


nikkie   (2003-06-19 14:13:00) [2]

>убрать NewTraffic.Free;
ну до кучи еще и эту строчку убрать надо
NewTraffic:=TMyTraffic.Create(nil);

про virtual я сам был не в курсах - извини уж, больно много кода ты напихал.

соответственно, когда я увидел, что ты пишешь компоненту, то решил, что Object Pascal ты знаешь. а выяснилось, что весь затык в том, что ты просто не знаешь языка, на котором пишешь.

>а объяснить самому?
у меня терпение не как у Юрия Зотова. а навык чтения документации, он полезен, поверь мне.

ты вот лучше скажи - рецепт ты знаешь, что удалить и что исправить. а почемутак надо сделать, ты понимаешь?


Hogo   (2003-06-19 08:27:00) [3]


procedure DataReceived(var ABuffer; const AByteCount: integer); virtual;
( var ABuffer; const AByteCount: integer)


procedure DataReceived(var ABuffer; const AByteCount: integer); virtual;
procedure DataSent(var ABuffer; const AByteCount: integer); virtual;

исправить virtualна override

if NewTraffic<>nil then
begin
AThread.Connection.Intercept:=NewTraffic;
AThread.Connection.InterceptEnabled:=true;
NewTraffic.Free;
end;

убрать NewTraffic.Free;
nikkie
Вот это вот трудно было просто написать?


Hogo   (2003-06-19 06:10:00) [4]


> nikkie © (18.06.03 23:14)
> ну я же говорю, основы надо учить. почитай что ли Object
> Pascal Reference, Classes and Objects, Overview или книжку
> какую про ООП в дельфи.

а объяснить самому?


nikkie   (2003-06-18 23:14:00) [5]

ну я же говорю, основы надо учить. почитай что ли Object Pascal Reference, Classes and Objects, Overview или книжку какую про ООП в дельфи.


Hogo   (2003-06-18 21:42:00) [6]


> nikkie © (18.06.03 16:09)
> что тебе сперва основы программирования в Дельфи выучить
> надо.
> 1. Как ты думаешь, что будет храниться в переменной NewTraffic
> после
> NewTraffic:=TMyTraffic.Create(nil);
> NewTraffic:=TraffStat.AddConnection(PeerIp, Port);

Хранится то что надо а именно обект idlogdebug немного измененный в котором записан порт и ип клиента дополнительно.

> 2. Как ты полагаешь, что делает метод Free и каков будет
> результат выполнения
> AThread.Connection.Intercept:=NewTraffic;
> ( PeerIp, Port)


> nikkie © (18.06.03 16:09)
> что тебе сперва основы программирования в Дельфи выучить
> надо.
> 1. Как ты думаешь, что будет храниться в переменной NewTraffic
> после
> NewTraffic:=TMyTraffic.Create(nil);
> NewTraffic:=TraffStat.AddConnection(PeerIp, Port);

Хранится то что надо а именно обект idlogdebug немного измененный в котором записан порт и ип клиента дополнительно.

> 2. Как ты полагаешь, что делает метод Free и каков будет
> результат выполнения
> AThread.Connection.Intercept:=NewTraffic;
> NewTraffic.Free;

NewTraffic локальная переменная только для процедуры onconnect.
взято вот откуда
TMyTraffic *NewTraffic = TraffStat->AddConnection(PeerIp, Port);
if (NewTraffic)
{
AThread->Connection->Intercept = NewTraffic;
AThread->Connection->InterceptEnabled = true;
}


nikkie   (2003-06-18 16:09:00) [7]

>И что же понятно?
что тебе сперва основы программирования в Дельфи выучить надо.

1. Как ты думаешь, что будет храниться в переменной NewTraffic после
NewTraffic:=TMyTraffic.Create(nil);
NewTraffic:=TraffStat.AddConnection(PeerIp, Port);


2. Как ты полагаешь, что делает метод Free и каков будет результат выполнения
AThread.Connection.Intercept:=NewTraffic;
NewTraffic.Free;


Hogo   (2003-06-18 13:35:00) [8]


> nikkie © (18.06.03 13:06)
> все стало понятно.

И что же понятно?


nikkie   (2003-06-18 13:06:00) [9]

после вот этого кода
NewTraffic:=TMyTraffic.Create(nil);
NewTraffic:=TraffStat.AddConnection(PeerIp, Port);
if NewTraffic<>nil then
begin
AThread.Connection.Intercept:=NewTraffic;
AThread.Connection.InterceptEnabled:=true;
NewTraffic.Free;
end;

все стало понятно.


Hogo   (2003-06-18 05:59:00) [10]


> nikkie © (18.06.03 00:26)

Код я впихнул что-бы понятнее было


nikkie   (2003-06-18 00:26:00) [11]

Меня больше удивляет, что у тебя Access Violation не вылетает. Я конечно извиняюсь, что сразу внимание на этот код не обратил, но уж больно много всякого кода ты пихнул в первое сообщение. Ты сам-то о чем думал, когда его писал?


Hogo   (2003-06-17 22:37:00) [12]

Верхнее сообщение от меня


Зашел на огонёк   (2003-06-17 22:36:00) [13]


NewTraffic:=TMyTraffic.Create(nil);
NewTraffic:=TraffStat.AddConnection(PeerIp, Port);
if NewTraffic<>nil then
begin
AThread.Connection.Intercept:=NewTraffic;
AThread.Connection.InterceptEnabled:=true;
NewTraffic.Free;
( тип TMyTraffic=class(TIdConnectionIntercept)


NewTraffic:=TMyTraffic.Create(nil);
NewTraffic:=TraffStat.AddConnection(PeerIp, Port);
if NewTraffic<>nil then
begin
AThread.Connection.Intercept:=NewTraffic;
AThread.Connection.InterceptEnabled:=true;
NewTraffic.Free;
end;

вот в этом коде я вместо NewTraffic(тип TMyTraffic=class(TIdConnectionIntercept)) использовал TMyTraffic=class(TIdLogDebug).
соответственно перед присвоением к AThread.Connection.Intercept
я задавал имя файла и активировал лог дебуг файл создавался как я говорил но в него ничего не писалось.

Пробовал сделать используя компонент на форме TIdMappedPortTCP
в его событии OnConnect делал следующее:

...
var IdLogDebug1: TIdLogDebug;
...OnConnect...;
begin
IdLogDebug1:=TdLogDebug1.create;
IdLogDebug1.FileName:="tcp.log";
IdLogDebug1.active:=true;
AThread.Connection.Intercept:=IdLogDebug1;
AThread.Connection.InterceptEnabled:=true;
end;

тогда файл создается и в него пишется лога принал запросил и т.д.


nikkie   (2003-06-17 21:19:00) [14]

Ладно, пусть тебе будет стыдно...
IdLogDebug1.FileName := ...
IdLogDebug1.Active := True
IdTCPClient1.Intercept := IdLogDebug1
IdTCPClient1.InterceptEnabled := True


На счет того, что ты пишешь на основе IdMappedPortTCP. Все конечно, зависит от того, как далеко ты отошел от прототипа... Но самое простое - считать трафик в тот момент, когда ты посылаешь/принимаешь данные. В IdMappedPortTCP это происходит в одном месте:
if IndexOf(TObject(AThread.Connection.Binding.Handle)) > -1 then
begin
LData.OutboundClient.Write(AThread.Connection.CurrentReadBuffer);
end;
if IndexOf(TObject(LData.OutboundClient.Binding.Handle)) > -1 then
begin
AThread.Connection.Write(LData.OutboundClient.CurrentReadBuffer);
end;


Вариант с Intercept, конечно, тоже возможен и может иметь преимущество, если у тебя Write из кучи разных мест вызывается. А почему бы не использовать просто событие OnWork у IdTCPClient?


Hogo   (2003-06-17 09:34:00) [15]


> nikkie © (16.06.03 15:47)
> >Отвечаю на вопрос IdLogDebug я пользоваться не умею.
> учись

Мда попробовал я IdLogDebug,
файл лога создается и тут же прекращается к нему доступ,
т.е. в него ничего не пишется.
Может ли это быть из-за того что я храню объекты в TList?
У меня получается, что в TList хранится еще один TList.


nikkie   (2003-06-17 00:02:00) [16]

Либо ты не хочешь понимать, что тебе говорят, либо не можешь. Во втором случае, есть надежда, что форум тебе поможет. Надо только читать и перечитывать до полного просветления.

ЗЫ Все мои посты выше написаны на полном серьезе и содержат ответы на твои проблемы так, как я смог понять их из твоих сообщений.


hogo   (2003-06-16 22:07:00) [17]


> nikkie © (16.06.03 15:44)

Зачем тогда ваабще нужен этот форум?
Я пришел что бы спросить как сделать или узнать почему не работает,
а не за тем, чтобы меня тыкали носом что я чего-то не умею.


nikkie   (2003-06-16 15:47:00) [18]

>Отвечаю на вопрос IdLogDebug я пользоваться не умею.
учись


nikkie   (2003-06-16 15:44:00) [19]

>Я пишу не компонент а просто объект
позволю себе усомниться
TMyTraffic=class(TIdConnectionIntercept)
TIdConnectionIntercept = class(TIdBaseComponent)
TIdBaseComponent = class(TComponent)

>и готовыми я умею пользоваться. Просто я раньше никогда не сталкивался с компонентами Indy.
то есть никогда с ними не сталкивался, но пользоваться умеешь?

>Я пишу прокси сервер на основе объекта TIdMappedPortTCP
смотрим исходники:
TIdMappedPortTCP = class(TIdTCPServer)
TIdTCPServer = class(TIdComponent)
TIdComponent = class(TIdBaseComponent)
TIdBaseComponent = class(TComponent)

TIdLogDebug = class(TIdLogBase)
TIdLogBase = class(TIdConnectionIntercept)
TIdConnectionIntercept = class(TIdBaseComponent)
TIdBaseComponent = class(TComponent)

мораль: 1. TIdMappedPortTCP к вопросу никакого отношения не имеет. 2. если ты не умеешь пользоваться TIdLogDebug, то и воспользоваться тем, что сам напишешь на основе того же базового класса, не сможешь.


Hogo   (2003-06-16 13:37:00) [20]


> nikkie © (11.06.03 15:37)
> прежде чем писать свои компоненты, надо быть уверенным,
> что умеешь пользоваться готовыми. я так и не понял, умеешь
> ли ты пользоваться IdLogDebug (а не IdLogMessage, сорри).

Я пишу не компонент а просто объект, и готовыми я умею пользоваться. Просто я раньше никогда не сталкивался с компонентами Indy.
Отвечаю на вопрос IdLogDebug я пользоваться не умею.
Я пишу прокси сервер на основе объекта TIdMappedPortTCP, осталось сделать подсчет трафика для каждого соединения, вот здесь я и за стопорился.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо