Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.28;
Скачать: CL | DM;

Вниз

Объект на основе TIdConnectionIntercept   Найти похожие ветки 

 
Hogo ©   (2003-06-03 12:17) [0]

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

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-04 21:40) [1]

Что никто не сталкивался с такой проблемой?


 
nikkie ©   (2003-06-04 22:16) [2]

а какой-нибудь IdLogMessage у тебя работает? ты, наверное, не активизировал его.


 
Hogo ©   (2003-06-06 06:22) [3]

I>
> а какой-нибудь IdLogMessage у тебя работает? ты, наверное,
> не активизировал его.

Есть IdLogDebug для чего его использовать?


 
Hogo ©   (2003-06-11 08:34) [4]

Выходит:
1) либо никто этого незнает.
2) знают но за бесплатно не отдадут.

Вопрос: За сколько?


 
yaJohn ©   (2003-06-11 11:06) [5]

А ковырнутся в индевых сырцах и посмотреть кто когда и при каких условиях вызывает? Они (сырцы) бесплатные.


 
nikkie ©   (2003-06-11 15:37) [6]

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


 
Hogo ©   (2003-06-16 13:37) [7]


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

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


 
nikkie ©   (2003-06-16 15:44) [8]

>Я пишу не компонент а просто объект
позволю себе усомниться
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, то и воспользоваться тем, что сам напишешь на основе того же базового класса, не сможешь.


 
nikkie ©   (2003-06-16 15:47) [9]

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


 
hogo ©   (2003-06-16 22:07) [10]


> nikkie © (16.06.03 15:44)

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


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

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

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


 
Hogo ©   (2003-06-17 09:34) [12]


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

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


 
nikkie ©   (2003-06-17 21:19) [13]

Ладно, пусть тебе будет стыдно...
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?


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


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;

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


 
Hogo ©   (2003-06-17 22:37) [15]

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


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

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


 
Hogo ©   (2003-06-18 05:59) [17]


> nikkie © (18.06.03 00:26)

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


 
nikkie ©   (2003-06-18 13:06) [18]

после вот этого кода
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 13:35) [19]


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

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


 
nikkie ©   (2003-06-18 16:09) [20]

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

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


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


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


> 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 23:14) [22]

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


 
Hogo ©   (2003-06-19 06:10) [23]


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

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


 
Hogo ©   (2003-06-19 08:27) [24]


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
Вот это вот трудно было просто написать?


 
nikkie ©   (2003-06-19 14:13) [25]

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

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

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

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

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


 
Hogo ©   (2003-06-19 14:45) [26]

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



Страницы: 1 вся ветка

Текущий архив: 2003.08.28;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.025 c
7-92289
Alta
2003-06-16 09:24
2003.08.28
имя компьютера...


8-92122
Xeon
2003-04-29 18:39
2003.08.28
Видео


3-92078
MMF
2003-07-25 10:52
2003.08.28
Проблемы с документом (связка master-detail)


8-92118
I hate C++
2003-05-03 23:24
2003.08.28
DirectX 9 SDK


3-92008
kengura
2003-08-05 13:08
2003.08.28
Ошибка при обращении к пустому полю в ADOTable