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

Вниз

проблемы с TServerSocket   Найти похожие ветки 

 
BoxTer   (2004-09-10 08:23) [0]

Доброе время суток. У меня возникла такая ситуация. Прога, рассылающая по таймеру куче клиентов некую строку кодом:
 try
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
       ServerSocket1.Socket.Connections[i].SendText(st);
 except
   on E: Exception do Begin
     Memo1.Lines.Add(DateTimeToStr(now)+" "+InttoStr(E.HelpContext)+", "+E.Message);
   exit;
   end;
 end;

в обработчике ошибок ServerSocket1ClientError

 Memo1.Lines.Add(DateTimeToStr(now)+" - Ошибка "+Inttostr(ErrorCode));
 if ErrorCode=10054 then Begin
     Socket.Disconnect(0);
     ErrorCode:=0;
 end;
уnd;

вываливает ошибку 10054. В MSDN глянул - там все понятно, неудачно отключается клиент. Все клиентские проги обновить просто не смогу - их множество. Даже не смотря на обнуление ошибки, сервер через некоторое время останавливается.
Причем, E.Message выдает "Вышел за пределы границ(-1)"...
Как мне справиться с этим на сервере?


 
BoxTer   (2004-09-10 08:24) [1]

и убирание строки из обработчика ошибок Socket.Disconnect(0); на работу никак не влияет...


 
BoxTer   (2004-09-10 09:01) [2]

E.Message выдает "Вышел за пределы границ(-1)" после каждой отправки на клиентов... т.е. на отправке except вываливается каждый раз после негоего неудачного отключения юзера...


 
Digitman ©   (2004-09-10 09:27) [3]

а E.ClassName что говорит ?


 
Verg ©   (2004-09-10 10:28) [4]

Socket.Disconnect(0);

Что за ноль?

Socket.Close;


 
BoxTer   (2004-09-10 11:45) [5]

2DigitMan: грит 0
2Verg: пробовал, не помогает!


 
Digitman ©   (2004-09-10 12:13) [6]


> грит 0


чего-чего ? какой такой еще "ноль" ?
любому исключению в Делфи соответствует конкретный вполне определенный класс, имя которого я у тебя и пытаюсь выведать ..

E.Message ты прочитал ? ну точно так же и в том же месте прочитай E.ClassName ! Это - важная инф-ция .. поважней, пожалуй, чем E.Message ...
а "Вышел за пределы границ(-1)" мне пока ни о чем не говорит


 
NAlexey ©   (2004-09-13 10:18) [7]

>BoxTer   (10.09.04 08:23)  
Я бы предположил что во время работы цикла меняется количество активных подключений. Попробуй поместить его в критическую секцию.


 
BoxTer   (2004-09-13 11:52) [8]

2DigitMan: EStringListError - причем тут это? ниче не понимаю!
2NAlexey: дык там и стоит try...


 
Digitman ©   (2004-09-13 12:14) [9]


> EStringListError - причем тут это?


где-то в своей программе ты обращаешься к объекту класса TStringList к элементу, индекс которого выходит за пределы диапазона 0..StringList.Count - 1


 
BoxTer   (2004-09-13 12:38) [10]

да я в курсе... но в том-то и пирог, что нету такого!
И самое парадоксальное, шо этот класс ошибки вываливается в конструкции:
try
 for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
      ServerSocket1.Socket.Connections[i].SendText(st);
except
  on E: Exception do Begin
    Memo1.Lines.Add(DateTimeToStr(now)+" "+InttoStr(E.ClassName)+", "+E.Message);
  exit;
  end;
end;


 
VMcL ©   (2004-09-13 12:44) [11]

>InttoStr(E.ClassName)

Это еще что за бред?


 
Digitman ©   (2004-09-13 12:45) [12]


> BoxTer   (13.09.04 12:38) [10]


не знаю ...
при попытке обращения за пределы диапазона индексов списка Connections[] должно возбуждаться искл-е EListError, а не EStringListError .. ибо FConnections - это TList


 
Digitman ©   (2004-09-13 12:49) [13]


> BoxTer


да, действительно ...
см.
> VMcL ©   (13.09.04 12:44) [11]


горбатого лепишь ? код в [10] даже скомпилирован не мог быть, а уж о ран-тайм там и речи вообще не идет ...


 
Verg ©   (2004-09-13 12:54) [14]

Приведи все же код обработчиков событий
OnClientError и OnClientDisconnect;


 
BoxTer   (2004-09-13 13:15) [15]

2VMcL: пардон, я вставлял прям с форума - изменил, да не все :( В проге намана все!

OnClientError:
Memo1.Lines.Add(DateTimeToStr(now)+" - Ошибка "+Inttostr(ErrorCode));
     ErrorCode:=0;


OnClientDisconnect
 Memo1.Lines.Add(DateTimeToStr(now)+" - Отключился: "+Socket.RemoteHost+" c "+Socket.RemoteAddress+";");


 
Verg ©   (2004-09-13 13:39) [16]

ServerSocket1.ServerType = ?


 
BoxTer   (2004-09-13 14:55) [17]

stNonBlocking


 
Digitman ©   (2004-09-13 15:08) [18]

for i := ServerSocket1.Socket.ActiveConnections-1 downto 0 do
 try
   ServerSocket1.Socket.Connections[i].SendText(st);
 except
 end;


 
Verg ©   (2004-09-13 16:37) [19]


> [17] BoxTer   (13.09.04 14:55)
> stNonBlocking


Ну чудеса, да и только. :)
При ошибке на передаче происходит вызов Disconnect у такого сокета. Но собственно free у него вызывается отложенно (DeferFree). Тем не менее, в твоем случае дело каким-то образом доходит все же до реального Free у сокета в пределах цикла.
Либо ты что-то недопоказываешь нам, считая, что ошибки там быть не может точно, либо грабли вообще совершенно в другом месте, либо что-то путаешь.


 
BoxTer   (2004-09-14 10:29) [20]

Нет, выложил все шо есть!


 
Verg ©   (2004-09-14 10:39) [21]

Все - это когда от begin-а до end-а, а не

> OnClientError:
> Memo1.Lines.Add(DateTimeToStr(now)+" - Ошибка "+Inttostr(ErrorCode));
>      ErrorCode:=0;
>
> OnClientDisconnect
>  Memo1.Lines.Add(DateTimeToStr(now)+" - Отключился: "+Socket.RemoteHost+"
> c "+Socket.RemoteAddress+";");


 
BoxTer   (2004-09-14 12:03) [22]

2Verg... ну добавь мысленно ;) их


 
Digitman ©   (2004-09-14 12:18) [23]


> либо грабли вообще совершенно в другом месте


да они и есть в другом месте !

ума не приложу, в каком месте кода scktcomp.pas можно обнаружить строчку raise EStringListError.Create либо прямую или косвенныю ссылку на объект TStringList, который способен сгенерировать это исключение


 
les ©   (2004-10-18 12:28) [24]

Ошибка 11004 в сокете что это



Страницы: 1 вся ветка

Текущий архив: 2005.01.02;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
1-1103114526
Bobby Digital
2004-12-15 15:42
2005.01.02
Drag Edit


4-1100149622
hyper_omsk
2004-11-11 08:07
2005.01.02
com и мобильник


3-1102204750
slider9
2004-12-05 02:59
2005.01.02
где копать (начало баз данных)


14-1102759642
OneFragLeft
2004-12-11 13:07
2005.01.02
Загрузка из сети


1-1103185454
Arty
2004-12-16 11:24
2005.01.02
string routine