The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"запись в 'мертвый' сокет или смерть http сервера"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"запись в 'мертвый' сокет или смерть http сервера"
Сообщение от Almight emailИскать по авторуВ закладки on 25-Июн-03, 07:31  (MSK)
Приветствую!

Написал http сервер на perl, вроде работает норм.
Но вот не так давно сталкнулся с багом убивающем сервер.

Примерный код сервера:
while (1) {
foreach $client ($select->can_read(1)) {
if ($client == $server) {
$client = $server->accept();
$select->add($client);
} else {
$rv = $client->recv($data, POSIX::BUFSIZ, 0);
unless (defined($rv) && length $data) {
# Это должен быть конец файла, поэтому закрываем клиента
delete $inbuffer{$client};
delete $outbuffer{$client};
$select->remove($cllent);
close $client;
next;
}
$inburfer{$client} .= $data;
$outbuffer{$client} = handle ($inburfer{$client});
#handle - обработчик запросов
}
}
foreach $client ($select->can_write(1)) {
# Пропустить этого клиента, если нам нечего сказать
next unless exists $outbuffer{$client};
$rv = $client->send($outbuffer{$client}, O):
delete $inbuffer{$client};
delete $outbuffer{$client};  
$select->remove($cllent);
close($client);
next;
}
}

Такой сервер можно убить просто зажав F5 в браузере типа IE
получаю ошибку
Bad arg length for Socket::unpack_sockaddr_in, length is 4096, should be 16 at /usr/lib/perl5/i386-linux/Socket.pm line 312.

Подозреваю что выползает оно по причине закрытия сокета
сразу после получения полного http запроса т.е. после вызова handle
но перед циклом foreach $client ($select->can_write(1)) {
а т.к. в $outbuffer{$client} содержится ответ сервер пытаеся
записать их в "мертвый" сокет - это и приводит к смерти сервера

Не знаю правильно ли я понял причину смерти сервера,
но если так, то как поставить проверку на существования сокета
перед циклом foreach $client ($select->can_write(1)) ?

Сам сервер сидит тут chat.asut.ru:2340

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "запись в 'мертвый' сокет или смерть http сервера"
Сообщение от Almight emailИскать по авторуВ закладки on 25-Июн-03, 13:39  (MSK)
Проблема решина, тема закрыта!

--
BeZt RegardZ,
    .Almight*, hims[0x7fELF] ;)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "запись в 'мертвый' сокет или смерть http сервера"
Сообщение от procool emailИскать по авторуВ закладки on 25-Июн-03, 20:17  (MSK)
Я просто обрабатываю такую ошибку, да и все.
попробуй eval { }

eval {$rv = $client->send($outbuffer{$client}, 0);}
if  ($@) {
  print "Жопа! $@";
  ## очитска буфера
} else {
ok
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "запись в 'мертвый' сокет или смерть http сервера"
Сообщение от Almight emailИскать по авторуВ закладки on 28-Июн-03, 08:14  (MSK)
>Я просто обрабатываю такую ошибку, да и все.
>попробуй eval { }
>
> eval {$rv = $client->send($outbuffer{$client}, 0);}
>if  ($@) {
>  print "Жопа! $@";
>  ## очитска буфера
>} else {
> ok
>}

Не здесь баг сидел...
не на send`е ошибка, а на peerhost`е, а
при идентификации другого конца сокета когда того и в помине уже нет..

И в чем кайф просто обрабатывать ошибку?
разве не интересно копнуть поглубже и понять саму суть?

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру