Форум: "Сети";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];
ВнизОшибка при отправке на клиент Найти похожие ветки
← →
Tor © (2005-11-01 11:02) [0]Доброго времени сутов ALL!
При установке соединения клиента с сервером вызывается эта процедура и все проходит на ура, но когда второй раз она вызывается, то в строчке с коментарием появляется ошибка:
Access violation at address 00566BD4 in module "ITServer.exe". Read of address 00000000.
Получается что такого обьекта как TIdPeerThread(AThread^).Connection уже нет. Но как так может быть.
procedure TDM.SendCmd(ACmd: Integer; AMsg: string; AThread: Pointer);
var
CommBlock: TCommBlock;
begin
CommBlock.Command := ACmd;
CommBlock.Msg := AMsg;
if Assigned(TIdPeerThread(AThread^)) then
if TIdPeerThread(AThread^).Connection.Connected then // Здесь ошибка !!!!!!!!!!!!!!
TIdPeerThread(AThread^).Connection.WriteBuffer(CommBlock, SizeOf(CommBlock), true);
end;
← →
Digitman © (2005-11-01 13:39) [1]
> При установке соединения клиента с сервером вызывается эта
> процедура
с Луны вызывается ? или откуда ?
← →
Tor © (2005-11-01 14:42) [2]Вызывается, с одной и тойже процедуры. Соединение не прекращается.
Вот отсюда
SendCmd(CMD_LOCK, Msg, AClient.ClientThread);
AClient это произвольный класс который содержит указатель на клиентский паток, указатель заполняется при создании соединения в событии OnConnect у TCPServer-а.
Но AThread по своим свойствам идет на завершение. Не могу понять почему
← →
Digitman © (2005-11-01 15:12) [3]
> Вызывается, с одной и тойже процедуры
т.е. "с потолка".
ибо НЕТ никакой инф-ции о том , ИЗ какой конкретно.
в объяснениях своих пляши от обработчика OnExecute.
← →
Tor © (2005-11-01 15:56) [4]А пичем тут OnExecute? Ок
Вот начало:
нажимаем на кнопку
DM.UDPClient.Broadcast(UDP_CONNECT, FOptions.UDPPort);
Дальше сервер ждет когда клиент подключится к серверу через TCP соединение вот событие на установку соединения:
procedure TDM.TCPServerConnect(AThread: TIdPeerThread);
var
FClient: TSimpleClient;
begin
// FClient := nil;
FClient := GetClientByIP(AThread.Connection.Socket.Binding.PeerIP);
if Assigned(FClient) then
begin
FClient.ClientThread := @AThread;
SetClientStatus(FClient, csLock);
end
else
AThread.Connection.Disconnect;
end;
GetClientByIP - эта ф-ция возвращает клиентский произвольный класс.
ClientThread - это указатель на поток типа TIdPeerThread
SetClientStatus - процедура установки состояния клиента. она ниже
procedure TDM.SetClientStatus(AClient: TSimpleClient;
AStatus: TClientState; Msg: string = "");
begin
...
case AStatus of
csLock: SendCmd(CMD_LOCK, Msg, AClient.ClientThread);
...
end.
...
end;
отсюда вызывается SendCmd
procedure TDM.SendCmd(ACmd: Integer; AMsg: string; AThread: Pointer);
var
CommBlock: TCommBlock;
begin
CommBlock.Command := ACmd;
CommBlock.Msg := AMsg;
if Assigned(TIdPeerThread(AThread^)) then
if TIdPeerThread(AThread^).Connection.Connected then // Здесь ошибка !!!!!!!!!!!!!!
TIdPeerThread(AThread^).Connection.WriteBuffer(CommBlock, SizeOf(CommBlock), true);
end;
Так вот этот путь который я сейчас указал проходит, но когда я второй раз вызываю процедуру SetClientStatus возникает ошибка.
← →
Digitman © (2005-11-01 16:25) [5]дурь алгоритмическая какая-то ..
разбираться в этом барахле нет желания.
у тебя под рукой всегда есть встр.отладчик.
какого ляда ты им не воспользовался по сей момент - я не знаю.
← →
Tor © (2005-11-01 16:31) [6]Я тож не знаю че ты одну пургу несешь, а толком сказать ничего не можешь, будто тебя кото-то заствляет. Не хочешь разбираться не надо, ктонить другой поможет.
← →
Digitman © (2005-11-01 16:53) [7]когда отладчик не друг - других друзей не ищи.
← →
Tor © (2005-11-01 16:58) [8]Да пользовался я отладчиком, ничего путного не сказал. Ошибка скорее всего в непрапвильной передачи адреса. Ладно буду дальше пробывать, одними словами всего не добъешся.
Тема закрыта.
← →
Digitman © (2005-11-01 17:01) [9]
> пользовался я отладчиком, ничего путного не сказал
врешь.
причем - нагло.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c