![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TIdTCPServer + несколько клиентов. [D7]
Gym © (2004-03-07 16:31:00)Здравствуйте уважаемые мастера.
Подскажите, пожалуйста, как в TIdTCPServer узнать ip и порт, с которого подключился клиент, количество подключённых клиентов. Как отослать каждому клиенту, допустим, текстовую строку.
Спасибо.
Gym (2004-03-13 20:27:00) [1]to Verg
> Брось ты эту дрянь читать.
Ну я не только эту дрянь читаю, есть ещё пару книжек Фаронова :)
> Читай Вирта, Седжвика, Кнутта, Стивенса, Рихтера....
ОК. Прислушиваюсь. Завтра с утра полезу на яндекс указанных
авторов искать. А может есть прямые ссылки на их труды?
Буду благодарен.
(2004-03-13 20:20:00) [2]Удалено модератором
Verg (2004-03-13 19:21:00) [3]Я не знаю как кому, а по-мне - надо Horrific aka Фленов Михаил e-mail: vr_online@cydsoft.comКАЗНИТЬ за такие главы про "Указатели" - это ж диверсия какая-то! Чего человек себе думал такое, какой порошок нюхал?
Это что, из серии "хакеры, крекеры..."?
> [36] Gym © (13.03.04 17:35)
Брось ты эту дрянь читать. Читай Вирта, Седжвика, Кнутта, Стивенса, Рихтера.... и еще тут мастера тут назовут тебе много нормальных людей, к чьему слову можно и нужно прислушиваться....., если конечно хочешь программинг сделать своимделом, а не так - типа погулять прошелся...
Verg (2004-03-13 19:04:00) [4]
> Точно так же, если ты переменной объекту присвоишь нулевое
> значение, ты его уничтожишь, и объект больше не будет существовать.
Я ху... фигею в этом зоопарке..... :((
nikkie (2004-03-13 18:45:00) [5]>Может это "фокусы" ("жертва") некачественного перевода на русский?
не, это русский пишет.
>Это по какой теме?
тема называется "Указатели", перед этим есть какой-то разговор о строках, но в данном случае уже не про них речь.
предыдущее предложение:
Точно так же, если ты переменной объекту присвоишь нулевое значение, ты его уничтожишь, и объект больше не будет существовать.
http://www.podgoretsky.com/ftp/Docs/Delphi/Fleonov/Bibble/Ch%2010.pdf
Verg (2004-03-13 18:24:00) [6]
> А что если у тебя две переменные указывают на один и тот
> же адрес данных? Неужели при уничтожении одного из них данные
> уничтожаться и вторая переменная будет указывать на несуществующие
> данные? Нет, обьект будет уничтожен только после того, как
> все указатели на него будут уничтожены.
Я этого тоже не понимаю. Это по какой теме?
Может это "фокусы" ("жертва") некачественного перевода на русский?
Объект (блок памяти, record, class) будет уничтожен, а точее память им занимаемая будет отнесена к пулу свободной (доступной для последующего распределения), так сразу, как только будет вызвана процедура делающее это(.free, freemem, dispose, localfree, и т.п.).
Может там речь шла об объектах ядраили тому подобных механизмах? И ф-циях типа CloseHandle - так это тогда совсем другая "опера".
nikkie (2004-03-13 18:17:00) [7]судя по приведенной цитате, можно рекомендовать эту книгу не читать.
Gym (2004-03-13 17:35:00) [8]to Verg
> Data := nil - не уничтожает. Он присваевает значение nil
> и все больше ничего.
"Библия Делфи" автор Horrific www.vr-online.ru
А что если у тебя две переменные указывают на один и тот же адрес данных? Неужели при уничтожении одного из них данные уничтожаться и вторая переменная будет указывать на несуществующие данные? Нет, обьект будет уничтожен только после того, как все указатели на него будут уничтожены.
Видимо не правильно понял.
Gym (2004-03-13 17:20:00) [9]to Verg
> Я же написал - добавить перед, а не заменить.
> Что с глазами?
Сорри, с недосыпу ещё и не то примерещиться.
Теперь всё работает как часы. Спасибо.
Verg (2004-03-13 16:05:00) [10]
> Мой оператор (который с nil) он уничтожает обьект но не
> возвращает память в кучу, да? Т.е. при достаточном кол-ве
> конектов/дисконектов прога может забрать всю доступную динамическую
> память?
Похоже догадываешься.
Data := nil - не уничтожает. Он присваевает значение nil и все больше ничего. Хотя в данном случае это тоже нужно и важно. Т.к. при уничтожении потока, в деструкторе произойдет уничтожение объекта Data (см. несколко выше - я писал). Т.е. Data.Free. Если объект Data = nil, то Free просто ничего не сделает: особенныйтакой случай. Но память-то надо освободить (вернуть в кучу). Так что, dispose просто необходим.
Verg (2004-03-13 15:58:00) [11]Утечка памяти - знаешь что такое?
Verg (2004-03-13 15:56:00) [12]
> [31] Gym © (13.03.04 15:53)
> to Varg
>
> После того как заменил свой оператор
> AThread.Data:=nil;
> на твой
> dispose(PMyData(AThread.Data));
Кто ж тебе сказал заменять?
Я же написал - добавить перед, а не заменить.
Что с глазами?
Gym (2004-03-13 15:53:00) [13]to Varg
После того как заменил свой оператор
AThread.Data:=nil;
на твой
dispose(PMyData(AThread.Data));
при дисконекте в режиме запуска проги из под делфи
выскакивает окошко:
Project ... raised exception class EAccessViolation with
message 'Access violation at address ... Write of adress ...
Process stoped.
Если же прогу запускать саму по себе, из операционки то после
первого же дисконекта (который внешне проходит вроде бы нормально), она спотыкается на обработчике нажатия Button1.
Выкидывает окошко следующего содержания:
'Access violation at address ... Read of adress ...
Мой оператор (который с nil) он уничтожает обьект но не возвращает память в кучу, да? Т.е. при достаточном кол-ве конектов/дисконектов прога может забрать всю доступную динамическую память?
Verg (2004-03-13 08:07:00) [14]
> procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
> begin
> Memo1.Lines.Add('Disconnect: '+IntToStr(AThread.ThreadID)+PMyData(AThread.Data).Name);
dispose(PMyData(AThread.Data));
> AThread.Data:=nil;
> end;
Gym (2004-03-13 06:16:00) [15]И так если кому интересно, привожу полный текст моей работающейпрограммы ( если эту программу можно назвать моей :) ). Ещё раз спасибо всем тем, кто помогал мне.
unit ServUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent, IdComponent,
IdTCPServer, Buttons, StdCtrls, ExtCtrls;
type
PMyData = ^RMyData;
RMyData = record
Name : string;
Pass : string;
end;
TForm1 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
SpeedButton1: TSpeedButton;
IdTCPServer1: TIdTCPServer;
IdAntiFreeze1: TIdAntiFreeze;
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1 : TForm1;
SecondID : cardinal;
count : integer;
MyData : PMyData;
implementation
{$R *.dfm}
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
Memo1.Lines.Add(AThread.Connection.ReadLn);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
IdTCPServer1.Active:=True;
SecondID:=0;
count:=0;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
IdTCPServer1.Active:=False;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
i : integer;
begin
try
for i:=0 to IdTCPServer1.Threads.LockList.Count-1 do
begin
Memo1.Lines.Add(IntToStr(TIdPeerThread(IdTCPServer1.Threads.LockList.Items[i]).ThreadID));
IdTCPServer1.Threads.UnlockList;
Memo1.Lines.Add(PMyData(TIdPeerThread(IdTCPServer1.Threads.LockList.Items[i]).Data).Name);
IdTCPServer1.Threads.UnlockList;
end;
finally
IdTCPServer1.Threads.UnlockList;
end;
end;
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
Name : string;
Pass : string;
begin
AThread.Connection.WriteLn('GN');
Name:=AThread.Connection.ReadLn;
Memo1.Lines.Add(Name);
AThread.Connection.WriteLn('GP');
Pass:=AThread.Connection.ReadLn;
Memo1.Lines.Add(Pass);
AThread.Connection.WriteLn('OK');
New(MyData);
ATHread.Data:=TObject(MyData);
MyData^.Name:=Name;
MyData^.Pass:=Pass;
end;
procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
Memo1.Lines.Add('Disconnect: '+IntToStr(AThread.ThreadID)+PMyData(AThread.Data).Name);
AThread.Data:=nil;
end;
end.
Gym (2004-03-12 14:50:00) [16]Честно говоря пока всё равно ничего не получается. Выскакивают
Acces violation error всякие. Ну да уж с этим я сам попробую
разобраться. Благо информации для размышления вы мне подкинули
достаточно.
Отдельное спасибо Reindeer Moss Eater хорошо что есть люди которым не лень возиться с такими как я. :)))
Reindeer Moss Eater (2004-03-12 09:41:00) [17]Ничего не надо пересматривать.
Если Data не доживет до деструктора, то ровным счетом ничего криминального не случится. Чем бы эта дата ни была.
Varg (2004-03-12 09:39:00) [18]Оригинал 9.0.14:
procedure TIdThread.Cleanup;
begin
FreeAndNil(FData);
end;
Так что, надо бы пересмотреть
type
TMyData = class
public
Name : string;
Pass : string;
end;
.....................
.....................
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
Name : string;
Pass : string;
MyData : TMyData;
begin
Name:=AThread.Connection.ReadLn;
AThread.Connection.WriteLn('GET PASS');
Pass:=AThread.Connection.ReadLn;
AThread.Connection.WriteLn('OK');
MyData := TmyData.Create;
ATHread.Data:=MyData;
MyData.Name:=Name;
MyData.Pass:=Pass;
end;
Reindeer Moss Eater (2004-03-12 09:37:00) [19]Все равно никакого криминала нет.
Если в дисконнекте клиента сделать Dispose и присвоить Data:=nil;
Деструктор ничего даже не заметит.
Reindeer Moss Eater (2004-03-12 09:34:00) [20]Ну в общем да.
Data is not initialized in the Create constructor, but is released in the Destroy destructor.