Автор Тема: Ошибка в коде  (Прочитано 9646 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ZMeY

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 54
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Ошибка в коде
« Ответ #15 : 27 Февраля 2004, 15:49:35 »
NeoNox я прокоментирую каждую строку - ок?

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Ошибка в коде
« Ответ #16 : 27 Февраля 2004, 16:17:32 »
конечно
The documentations is your friend

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Ошибка в коде
« Ответ #17 : 27 Февраля 2004, 16:28:22 »
кстати, посмотри вот сюда - http://poe.perl.org/?Listing.evolution.select учиться лучше на правильном коде.
The documentations is your friend

Оффлайн ZMeY

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 54
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Ошибка в коде
« Ответ #18 : 27 Февраля 2004, 16:31:15 »
Код:

use IO::Socket;
use 
IO::Select;
use 
HTTP::Daemon;
use 
POSIX;
use 
strict;

use 
Fcntl;

$|=
1;

my $port 5555;
my $max_clients 35#SOMAXCONN

my $server HTTP::Daemon->new(Proto => \'tcp\', LocalPort => $port, Listen => $max_clients) or die "Can\'t make server socket: $@\\n";
nonblock($server);
my $select = IO::Select->new($server);


print "[Chat server runing on ", $server->url, "] \\n\\n";



while (1)
{
my $client; #объявляю переменную

	
foreach $client ($select->can_read(1)) #по очереди обращаюсь ко всем сокетам объекта селект
	
{
	
	
if ($client == $server) #если сокет является слушающим сервером
	
	
{
	
	
my $new_client = $server->accept(); #акцепт нового клиента
	
	
	
if(defined($new_client)) #если новый клиент подключен
	
	
	
{
	
	
	
nonblock($new_client); #перевод клиента в неблокирующий режим
	
	
	
$select->add($new_client); #добавляем клиента в общую группу сокетов
	
	
	
print "Client accepted\\n";
	
	
	
}
	
	
}
	
	
else
	
	
{
	
	
	
#это подскажанный код - что он делает сказать не могу, но смысл такой: определение отключившихся клиентов
	
	
	
my $data = \'\';  
	
	
	
my $rv = $client->recv($data, POSIX::BUFSIZ, 0);
	
	
	
if(!(defined($rv) && length $data))#если клиент отключился
	
	
	
{
	
	
	
	
$select->remove($client); #удаляем клиента из группы соктов
	
	
	
	
close($client); #закрываем клиента
	
	
	
	
print "Client closed\\n";
	
	
	
	
next; #переходим к следующему элементу группы клиентов
	
	
	
}
	
	
	
else #если клиент на связи
	
	
	
{
	
	
	
	
my $request = $client->get_request();#посылаем запрос
	
	
	
	
if (defined($request))#т.к. клиент в неблок. режиме - проверяем наличие запроса
	
	
	
	
{
	
	
	
	
        if ($request->method eq \'GET\')#если отправлен запрос гет
	
	
	
	
	
{
	
	
	
	
	
	
print $request->as_string; #отладочная строка, поднее будет заменена кодом обработки строки запроса
	
	
	
	
        }
	
	
	
	
}#конец обработки реквеста
	
	
	
}#конец обработки клиента
	
	
}
	
}
}



sub nonblock {
     my $sock = shift;

     if ($^O eq \'MSWin32\')
     {
           sub FIONBIO { 0x8004667e }
           my $set_it = "1";
           ioctl($sock, FIONBIO, $set_it)
                 or die "Can\'t set the socket non-blocking: $!";
     } else {
           my $flags = fcntl($sock, F_GETFL, 0)
                 or die "fcntl fails with F_GETFL: $!";
           fcntl($sock, F_SETFL, $flags | O_NONBLOCK)
                 or die "fcntl fails with F_SETFL: $!";
     }
}




Вопрос такой - как заменить непрокоментированный блок, таким обрахззом, что бы он возвращал истину, если клиент он-лайн и лож, если отключился
« Последнее редактирование: 27 Февраля 2004, 17:27:30 от NeoNox »

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Ошибка в коде
« Ответ #19 : 27 Февраля 2004, 17:27:16 »
То что тебя интересует это чтение из ранее установленного сокета.
The documentations is your friend

Оффлайн ZMeY

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 54
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Ошибка в коде
« Ответ #20 : 27 Февраля 2004, 21:12:46 »
NeoNox я знаю, что это чтение - я не совсем пониаю, как с его помощью определяется статус клиента...ну да это и не важно!

Как заменить этот код другими кодом, который однозначно будет определять - на связи клиент или уже отключился

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28