Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.29;
Скачать: CL | DM;

Вниз

переход с Indy9 на Indy10   Найти похожие ветки 

 
3asys ©   (2012-01-01 15:52) [0]

Добрый день,
переношу с 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
Т.е. клиент сообщает серверу о подключении, сервер это сообщение принимает, добавляет в свой список нового клиента, формирует список всех клиентов - все это нормально отрабатывается, но когда сервер пытается этот список всех клиентов отослать - возникает ошибка.
Что здесь не так, что можно сделать?


 
Anatoly Podgoretsky ©   (2012-01-01 17:27) [1]

> 3asys  (01.01.2012 15:52:00)  [0]

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


 
3asys ©   (2012-01-01 18:49) [2]


> Anatoly Podgoretsky ©

Вы имеете в виду DestThread ?
Пробовал создавать:

DestThread:=TIdContext.Create(AContext.Connection,AContext.Yarn);

но результат не изменился (Access violation).
В чем может быть ошибка?


 
Германн ©   (2012-01-01 19:00) [3]


> В чем может быть ошибка?

Имхо в неправильном использовании Buf : TIdBytes


 
3asys ©   (2012-01-01 20:15) [4]


> Германн ©  

Buf инициализируется данными их Package, но вызвать Access violation в этом коде Buf, мне кажется, не может. Перепробовал  множество вариантов, но просто не вижу, что тут не так. Не могли бы Вы уточнить, что имеется в виду?


 
Германн ©   (2012-01-01 20:31) [5]

С Indy не знаком, но имхо TIdBytes это array of Byte.
А раз это динамический массив, то во-первых ему нужно выделить память,  во-вторых нужно передавать в качестве адреса буфера не Buf, а Buf[0] и в третьих размер буфера возвращается функцией Length, а не SizeOf.


 
3asys ©   (2012-01-01 21:18) [6]


> Германн ©

К сожалению, попытка передать Buf[0] вместо Buf приводит к сообщению, что требуется объект TIdBytes, а не Byte


 
3asys ©   (2012-01-01 21:24) [7]

> Anatoly Podgoretsky ©
Не могли бы Вы указать, правильно ли я Вас понял [2]? - если да, то в чем ошибка?, а если нет - то, что следовало бы сделать?


 
Anatoly Podgoretsky ©   (2012-01-01 22:47) [8]


> С Indy не знаком, но имхо TIdBytes это array of Byte.

TIdBytes = TBytes;


 
3asys ©   (2012-01-02 15:04) [9]

В первой части процедуры Buf инициализируется и с его участием все отрабатывается правильно (новый пользователь добавляется в список),  поэтому, вероятно дело не в способе работы с Buf.
В этой первой части, кстати IOHandler при выполнении не равен nil.
Представляется, что дело в DestThread, возможно я его неправаильно использую или просто в какой-то глупой ошибке.
Третий день стараюсь решить эту срочную задачу и пока ничего не получается. Может кто-то сможет указать, как правильно?



Страницы: 1 вся ветка

Текущий архив: 2012.04.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
15-1324556838
OW
2011-12-22 16:27
2012.04.29
Быдлокодером в Питере, продержаться пару-тройку месяцев реально?


4-1256726104
Инна
2009-10-28 13:35
2012.04.29
Bitmap+Lineto


15-1324955057
Дмитрий С.
2011-12-27 07:04
2012.04.29
Delphi, разработка программ под iOS IPhone


2-1325325464
Gu
2011-12-31 13:57
2012.04.29
simplesharemem


15-1321709041
Sergey Masloff
2011-11-19 17:24
2012.04.29
Знатокам регулярных выражений