![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблемы с TServerSocket [D5, Win2k]
BoxTer © (2004-09-10 08:23:00)Доброе время суток. У меня возникла такая ситуация. Прога, рассылающая по таймеру куче клиентов некую строку кодом:
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)'...
Как мне справиться с этим на сервере?
les (2004-10-18 12:28:00) [1]Ошибка 11004 в сокете что это
Digitman (2004-09-14 12:18:00) [2]
> либо грабли вообще совершенно в другом месте
да они и есть в другом месте !
ума не приложу, в каком месте кода scktcomp.pas можно обнаружить строчку raise EStringListError.Create либо прямую или косвенныю ссылку на объект TStringList, который способен сгенерировать это исключение
BoxTer (2004-09-14 12:03:00) [3]2Verg... ну добавь мысленно ;) их
Verg (2004-09-14 10:39:00) [4]Все - это когда от 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 10:29:00) [5]Нет, выложил все шо есть!
Verg (2004-09-13 16:37:00) [6]
> [17] BoxTer (13.09.04 14:55)
> stNonBlocking
Ну чудеса, да и только. :)
При ошибке на передаче происходит вызов Disconnect у такого сокета. Но собственно free у него вызывается отложенно (DeferFree). Тем не менее, в твоем случае дело каким-то образом доходит все же до реального Free у сокета в пределах цикла.
Либо ты что-то недопоказываешь нам, считая, что ошибки там быть не может точно, либо грабли вообще совершенно в другом месте, либо что-то путаешь.
Digitman (2004-09-13 15:08:00) [7]for i := ServerSocket1.Socket.ActiveConnections-1 downto 0 do
try
ServerSocket1.Socket.Connections[i].SendText(st);
except
end;
BoxTer (2004-09-13 14:55:00) [8]stNonBlocking
Verg (2004-09-13 13:39:00) [9]ServerSocket1.ServerType = ?
BoxTer (2004-09-13 13:15:00) [10]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 12:54:00) [11]Приведи все же код обработчиков событий
OnClientError и OnClientDisconnect;
Digitman (2004-09-13 12:49:00) [12]
> BoxTer
да, действительно ...
см.
> VMcL © (13.09.04 12:44) [11]
горбатого лепишь ? код в [10] даже скомпилирован не мог быть, а уж о ран-тайм там и речи вообще не идет ...
Digitman (2004-09-13 12:45:00) [13]
> BoxTer (13.09.04 12:38) [10]
не знаю ...
при попытке обращения за пределы диапазона индексов списка Connections[] должно возбуждаться искл-е EListError, а не EStringListError .. ибо FConnections - это TList
VMcL (2004-09-13 12:44:00) [14]> InttoStr(E.ClassName)
Это еще что за бред?
BoxTer (2004-09-13 12:38:00) [15]да я в курсе... но в том-то и пирог, что нету такого!
И самое парадоксальное, шо этот класс ошибки вываливается в конструкции:
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;
Digitman (2004-09-13 12:14:00) [16]
> EStringListError - причем тут это?
где-то в своей программе ты обращаешься к объекту класса TStringList к элементу, индекс которого выходит за пределы диапазона 0..StringList.Count - 1
BoxTer (2004-09-13 11:52:00) [17]2DigitMan: EStringListError - причем тут это? ниче не понимаю!
2NAlexey: дык там и стоит try...
NAlexey (2004-09-13 10:18:00) [18]>BoxTer (10.09.04 08:23)
Я бы предположил что во время работы цикла меняется количество активных подключений. Попробуй поместить его в критическую секцию.
Digitman (2004-09-10 12:13:00) [19]
> грит 0
чего-чего ? какой такой еще "ноль" ?
любому исключению в Делфи соответствует конкретный вполне определенный класс, имя которого я у тебя и пытаюсь выведать ..
E.Message ты прочитал ? ну точно так же и в том же месте прочитай E.ClassName ! Это - важная инф-ция .. поважней, пожалуй, чем E.Message ...
а 'Вышел за пределы границ(-1)' мне пока ни о чем не говорит
BoxTer (2004-09-10 11:45:00) [20]2DigitMan: грит 0
2Verg: пробовал, не помогает!