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

Вниз

Объект на основе 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.007 c
3-92025
Nylx
2003-08-04 22:25
2003.08.28
RaveReports


1-92116
dvp1
2003-08-15 14:48
2003.08.28
Как отсортировать данные в двухпольном TStringGrid?


14-92212
clickmaker
2003-08-11 16:50
2003.08.28
Устоявшийся мужчина


3-92052
Isf
2003-08-04 12:05
2003.08.28
Key violation


7-92288
WMag
2003-06-13 23:29
2003.08.28
Символ разделения целой и дробной частей





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский