![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
переход с Indy9 на Indy10 [D7]
3asys © (2012-01-01 15:52:00)Добрый день,
переношу с Indy9 на Indy10 клиент-серверное приложение. При подключении клиента к серверу происходит событие:
procedure TfmServer.IdTCPServerConnect(AContext: TIdContext);
var
NewConnection, DestConnection : WConnection;
Package, NewPackage: TPackage;
// DestThread: TIdPeerThread;
DestThread: TIdContext;
Buf : TIdBytes;
i:integer;
s, ss :string;
begin
GetMem(NewConnection, SizeOf(TConnection));
// NewConnection.Host :=AThread.Connection.LocalName;
NewConnection.Host :=AContext.Connection.Socket.Binding.PeerIP;
// NewConnection.Thread :=AThread;
NewConnection.Thread :=AContext.Yarn;
// AThread.Data:=TObject(NewConnection);
AContext.Data:=TObject(NewConnection);
try
ConnectionLst.LockList.Add(NewConnection);
finally
ConnectionLst.UnlockList;
end;
// AThread.Connection.ReadBuffer (Package, SizeOf (Package));
AContext.Connection.IOHandler.ReadBytes(Buf, sizeof(Package), false);
BytesToRaw(Buf, Package, sizeof(Package));
mmInf.Lines.Add('Новый клиент:'+ Package.UserNick + ' ' +TimeToStr(Time));
mmWho.Lines.Add(Package.UserNick);
s:='#N';
//создается список клиентов
for i:=1 to mmWho.Lines.Count-1 do
begin
ss:=mmWho.Lines[i];
s:= s + ss + ';';
end;
Delete(s, length(s), 1);
Package.Who:=s;
//отправка пользователям списка всех пользователей
NewPackage := Package;
with ConnectionLst.LockList do
try
for i := 0 to Count-1 do
begin
DestConnection := Items[i];
DestThread := DestConnection.Thread;
// DestThread.Connection.WriteBuffer(NewPackage, SizeOf(NewPackage), True);
Buf := RawToBytes(NewPackage, sizeOf(NewPackage));
// ВОТ ЗДЕСЬ ВОЗНИКАЕТ ОШИБКА:
DestThread.Connection.IOHandler.Write(Buf,sizeof(Buf), 0);
end;
finally
ConnectionLst.UnlockList;
end;
end;
В строке :
DestThread.Connection.IOHandler.Write(Buf,sizeof(Buf), 0);
возникает ошибка: "Access violation"
К слову, IOHandler в строке выдающей ошибку, перед ее отработкой =nil
Т.е. клиент сообщает серверу о подключении, сервер это сообщение принимает, добавляет в свой список нового клиента, формирует список всех клиентов - все это нормально отрабатывается, но когда сервер пытается этот список всех клиентов отослать - возникает ошибка.
Что здесь не так, что можно сделать?
3asys (2012-01-02 15:04:00) [1]В первой части процедуры Buf инициализируется и с его участием все отрабатывается правильно (новый пользователь добавляется в список), поэтому, вероятно дело не в способе работы с Buf.
В этой первой части, кстати IOHandler при выполнении не равен nil.
Представляется, что дело в DestThread, возможно я его неправаильно использую или просто в какой-то глупой ошибке.
Третий день стараюсь решить эту срочную задачу и пока ничего не получается. Может кто-то сможет указать, как правильно?
Anatoly Podgoretsky (2012-01-01 22:47:00) [2]
> С Indy не знаком, но имхо TIdBytes это array of Byte.
TIdBytes = TBytes;
3asys (2012-01-01 21:24:00) [3]> Anatoly Podgoretsky ©
Не могли бы Вы указать, правильно ли я Вас понял [2]? - если да, то в чем ошибка?, а если нет - то, что следовало бы сделать?
3asys (2012-01-01 21:18:00) [4]
> Германн ©
К сожалению, попытка передать Buf[0] вместо Buf приводит к сообщению, что требуется объект TIdBytes, а не Byte
Германн (2012-01-01 20:31:00) [5]С Indy не знаком, но имхо TIdBytes это array of Byte.
А раз это динамический массив, то во-первых ему нужно выделить память, во-вторых нужно передавать в качестве адреса буфера не Buf, а Buf[0] и в третьих размер буфера возвращается функцией Length, а не SizeOf.
3asys (2012-01-01 20:15:00) [6]
> Германн ©
Buf инициализируется данными их Package, но вызвать Access violation в этом коде Buf, мне кажется, не может. Перепробовал множество вариантов, но просто не вижу, что тут не так. Не могли бы Вы уточнить, что имеется в виду?
Германн (2012-01-01 19:00:00) [7]
> В чем может быть ошибка?
Имхо в неправильном использовании Buf : TIdBytes
3asys (2012-01-01 18:49:00) [8]
> Anatoly Podgoretsky ©
Вы имеете в виду DestThread ?
Пробовал создавать:
DestThread:=TIdContext.Create(AContext.Connection,AContext.Yarn);
но результат не изменился (Access violation).
В чем может быть ошибка?
Anatoly Podgoretsky (2012-01-01 17:27:00) [9]> 3asys (01.01.2012 15:52:00) [0]
Объект создавать будет Пушкин?