Форум: "Сети";
Текущий архив: 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