Форум: "Сети";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
Внизпроблемы с 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;
OnClientDisconnectMemo1.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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c