Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нагрузка на idhttpserver приводит к ошибке [D6, Win2k]


oleg_ ©   (2006-05-31 19:46:00) 

Если достаточно быстро сыпется множество запросов с одного лишь клиента (несколько быстрых рефрешей в браузере)
то idhttpserver  выдает ошибки eidsocketerror "Socket error # 10054"
блоки try except не спасают
Как с этим можно бороться?


oleg_   (2006-06-05 11:03:00) [1]

Скопировал IdStackBSDBase.pas в свой проект,  вставил в нем
try
except
вокруг вызова ошибки, все вроде как заработало

теперь вопрос с куками остался


oleg_   (2006-06-02 20:11:00) [2]

Да еще проблема с куками а следовательно со стандартной php-шной сессией есть
Сообщает мол
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent in ...\ttt.php on line 2

Видимо idhttpserver шлет некие свои заголовки раньше. Пробовал отловить  httpanalizer-ом момент их вывода, пока безуспешно-(


oleg_   (2006-06-02 19:56:00) [3]

Вот нашел комментарий
   // You can add this to your exception ignore list for easier debugging.
   // However please note that sometimes it is a true error. Your program
   // will still run correctly, but the debugger will not stop on it if you
   // list it in the ignore list. But for most times its fine to put it in
   // the ignore list, it only affects your debugging.
в
TIdStackBSDBase.RaiseSocketError
Добавил туда игнрирование нужной ошибки
только вот он не перекомпилируется почемуто, видимо  потому что он же не в моем проекте, и используется dcu


oleg_   (2006-06-02 19:34:00) [4]

Видимо потому что это отрабатывается очень быстро
А у меня cgi вызываются , на это уходит до секунды, за это время браузер успевает отработать refresh

А добиться такой же ошибки просто, поставив точку останова в commandget  и когда она сработает нужно нажать стоп в браузере.
Далее f9  и вот та самая ошибка отрключения удаленного пользователя

Я тоже перебрался на 10 инди и нашел в кодах что ошибка генерируется при
 LResponseInfo.WriteHeader;
в idcustomhttpserver.pas


umbra   (2006-06-02 19:13:00) [5]

у меня инди 10 и с таким OnCommandGetя могу нажимать в браузере на рефреш с любой скоростью - никаких ошибок нет.

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
 ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
 AResponseInfo.ContentText := 'Привет!';
end;


oleg_   (2006-06-02 16:32:00) [6]

Вот поставил 10 индю
попробую под ней найти как перехватить ошибки


oleg_   (2006-06-02 14:22:00) [7]

Я поставил точки останова на первые строки обработчиков
и на них управление не переходит

код такой

procedure TfmHTTPServerMain.HTTPServerException(AThread: TIdPeerThread;
 AException: Exception);
begin
try
if AException.ClassType= EIdSocketError then
   if (AException as EIdSocketError).LastError = 10054 then
     begin
     DisplayMessage('user disconnect');
     //AThread.Terminate;
     AException.Free;
//      AThread.Terminate;// .Connection.Connected:=false;
     end;
except
DisplayMessage('HTTPServerException');
end;
end;


umbra   (2006-06-02 14:11:00) [8]

а можно взглянуть на код обработчика?


oleg_   (2006-06-02 13:50:00) [9]

Да, именно так.

Пока копаю докуметацию по 9 инди


umbra   (2006-06-02 11:47:00) [10]

вы имеете в виду, что ошибка, которую Вы описывали, осталась и когда она происходит, обработчик onexceptionне вызывается ?


oleg_   (2006-06-01 17:19:00) [11]

Поставил Инди 9.00.10
у сервера есть события onexception onlistenexception
но они не пускаются при ошибках


umbra   (2006-06-01 13:35:00) [12]


> ошибка появляется после выхода из HTTPServerCommandGet,
> а его вызов где-то в самом компоненте -(
>

вызов его происходит в том самом DoExecute.
В общем, есть 2 варианта. первый - установить новый инди, там эта ошибка обрабатывается. Минус - возможно, ппридется править код, поскольку архитектура Инди 10 сильно отличается от Инди 9, а от 8-й, наверняка, еще сильней.
Второй - написать наследника TIdHTTPServer, в котором перекрыть метод DoExecute.


oleg_   (2006-06-01 13:14:00) [13]

ошибка появляется после выхода из HTTPServerCommandGet, а его вызов где-то в самом компоненте -(


oleg_   (2006-06-01 12:58:00) [14]

OnException у моего сервера нету, а есть только у потока AThread
OnException у AThread и у application не отлавливают эту ошибку
А DoExecute нигде мной и не вызывается, он же вызывается автоматически при поступлении нового запроса.


umbra   (2006-06-01 11:07:00) [15]


> Охват блоком защиты всего обработчика события HTTPServerCommandGet
>  увы ничего не дает.

неудивительно. В HTTPServerCommandGetВы определяете, что отвечать клиенту, но не происходит фактической отсылки данных. Не знаю, как в Инди 8, а в 10-й попытка записи происходит только в методе DoExecute, привыполнении которого и может возникнуть такая ошибка, как у Вас. В принципе, у сервера есть событие OnException, которое и предназначено для обработки ошибок, возникших при работе с сокетами. Попробуйте вставить tryв обработчик этого события


oleg_   (2006-05-31 20:47:00) [16]

Indy 8.0.25

Спасибо за справку насчет ошибки

Охват блоком защиты всего обработчика события HTTPServerCommandGet  увы ничего не дает.


umbra   (2006-05-31 20:32:00) [17]


> Socket error # 10054

эта ошибка означает, что когда сервер попытался ответить, то обнаружил, что соединение закрыто второй стороной (браузером). Бороться с этим надо блоками try ... except ... endи ловить исключение EIdSocketError. Затем проверить код ошибки и если он равен 10054, то закрыть соединение. Что-то вроде

try
{............................}
except
 on E: EIdSocketError do
    if E.LastError = 10054 then
       {сервер закрывает соединение}
end;


ЗЫ А какая у Вас версия Инди?


Наверх

Титульная страница Поиск, карта сайта Написать письмо