Форум: "Начинающим";
Текущий архив: 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