Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.03.2013, 18:39
Nanotentacle Nanotentacle вне форума
Прохожий
 
Регистрация: 09.03.2013
Сообщения: 3
Репутация: 10
По умолчанию Ошибка при отправке сообщений

Добрый день, уважаемые форумчане.
Возникла такая проблема: в программе используется TServerSocket в режиме stNonBlocking, принимает сообщения и отправляет их в ответ. Также имеется процедура, которая циклично через Server.Socket.Connections[i].SendText отправляет данные клиентам:
Код:
procedure TGProcessing.Multicast(st: String; exceptClient: TGLNumber);
var i:Byte; temp:integer;
begin
if self.Count <= 0 then Exit;
 temp := 0;
 if length(st) > 0 then
 begin
  for i := 0 to self.Server.Socket.ActiveConnections - 1 do
  begin
   if self.Client[exceptClient].SocketHandle <> self.Server.Socket.Connections[i].Handle then
   temp := temp + self.Server.Socket.Connections[i].SendText(st);
  end;
 end;
 self.FSend := self.FSend + temp;
end;

В момент, если происходит отключение клиента, постоянно вываливается ошибка. Ошибка вываливается при обращении к self.Client в различных частях программы, но, как удалось установить, причина именно в отключении клиента. Сам экземпляр Client не удаляется, а уходит в пул, поэтому он заведомо существует. Даже если его не существует, везде стоят проверки if assigned (Client) then.

Поэтому возникают три вопроса:
1) почему возникает подобная ошибка?
2) как ее можно избежать?
3) поможет ли режим stThreadBlocking для решения проблемы? Пока что не берусь переписывать код, вдруг кто-то встречался с подобным, а делать теоретически бесполезную работу не хочется, не будучи уверенным.

Спасибо за ответы.
Ответить с цитированием
  #2  
Старый 09.03.2013, 18:47
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

проверяй Connected
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Nanotentacle (09.03.2013)
  #3  
Старый 09.03.2013, 19:03
Nanotentacle Nanotentacle вне форума
Прохожий
 
Регистрация: 09.03.2013
Сообщения: 3
Репутация: 10
По умолчанию

Спасибо, только сейчас заметил такое свойство. В понедельник проверю, но, думаю, должно сработать.

Нет, свойство connected не помогло.

Есть подозрение, что событие OnClientDisconnect срабатывает позже вызова функции рассылки сообщений, несмотря на то, что клиента уже нет. Ошибку стабильно выдает вот на этой функции:

Код:
function TGProcessing.GetCount: TGLNumber;
var i:integer;
begin
result := 0;
for i := 1 to MaxClients do
 begin
 if not self.Client[i].Free then inc(result); //ошибка
 end;
end;

Вообще впервые встречаюсь с тем, что ошибка происходит с переменной, которая имеет мало отношения к самой ошибке. Как вариант, возможно, дело в Socket.Data, куда я записываю указатель на Client?

Да, и еще. Если убрать проверку кол-ва клиентов через функцию, указанную выше, то ошибку начинает выдавать вот здесь:

Код:
procedure TGProcessing.SrvClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
var Pl:^TGClientG; LN:integer;
begin
LN := 0;
Pl := socket.Data;
if assigned(Pl) then
 begin
 LN := Pl.LocalNumber;  //ошибка
 self.DeleteClient(Pl.LocalNumber);
 end;
end;

Последний раз редактировалось Nanotentacle, 11.03.2013 в 08:38. Причина: Это не чат!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter