Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.04.29;
Скачать: [xml.tar.bz2];

Вниз

переход с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
15-1324931403
Юрий
2011-12-27 00:30
2012.04.29
С днем рождения ! 27 декабря 2011 вторник


15-1324401094
SQLEX
2011-12-20 21:11
2012.04.29
Сосед президента. Обман или есть такой дом?


2-1325763307
Scott Storch
2012-01-05 15:35
2012.04.29
использование оператора goto


8-1219132442
young
2008-08-19 11:54
2012.04.29
Как увеличить картинку bmp без потери качества


15-1324623216
Faceless
2011-12-23 10:53
2012.04.29
информация об используемых библиотеках





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский