Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

переход с 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]

Объект создавать будет Пушкин?


Наверх

Титульная страница Поиск, карта сайта Написать письмо