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

Вниз

Ошибка при отправке на клиент   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.056 c
1-1136962161
alless
2006-01-11 09:49
2006.02.12
Как узнать что файл записался до конца в дир.?


6-1130963292
xman
2005-11-02 23:28
2006.02.12
PING


2-1138178193
pathfinder
2006-01-25 11:36
2006.02.12
Непонятная ошибка:(


2-1138316384
Glex
2006-01-27 01:59
2006.02.12
I/O error 105! Простейший, казалось бы, код...


15-1137576334
begin...end
2006-01-18 12:25
2006.02.12
Как отключить XP-стиль у окошка входа в Windows XP?