Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Онлайн сервер


Автор: VoAnt 12.5.2005, 13:43
Постановка задачи
Существует FreeBSD сервер, подключеный к интернет.
Задача заключается в написании приложения, к-е постонно висит в памяти сервера и принимает-отправляет данные от одного клиента - другому.
Как пример - ICQ

Впрос
Как быстро нацарапать такой минисервер с админкомандой "die", к-я выгружает программу из памяти.

#----------------

Поэтапно:

Этап 1
какие функции исспользуються для открытия портов и прослушивания их на предмет приёма.

Этап 2
как определить IP клиента

Этап 3
как держать такую программу всегда в памяти?

Спасибо за помощь!

Автор: Chuck 12.5.2005, 15:45
А не легче юзать уже готовое?
Цитата
какие функции исспользуються для открытия портов и прослушивания их на предмет приёма.

http://doc.diesel.elcat.kg/Perl/lib/site/LWP/Socket.html
http://www.getinfo.ru/article135.html
Цитата
как определить IP клиента

Юзать функции работы с сетью, протоколами, сокетами!
Цитата
как держать такую программу всегда в памяти?

chuck@mon chuck $ ./server &
И будет она у тебя висеть, пока сам не kill-нешь, либо пока она не завершится!

Автор: chaos 13.5.2005, 07:04
Цитата(VoAnt @ 12.5.2005, 13:43)
Постановка задачи
Существует FreeBSD сервер, подключеный к интернет.
Задача заключается в написании приложения, к-е постонно висит в памяти сервера и принимает-отправляет данные от одного клиента - другому.
Как пример - ICQ

Впрос
Как быстро нацарапать такой минисервер с админкомандой "die", к-я выгружает программу из памяти.

#----------------

Поэтапно:

Этап 1
какие функции исспользуються для открытия портов и прослушивания их на предмет приёма.

Этап 2
как определить IP клиента

Этап 3
как держать такую программу всегда в памяти?

Спасибо за помощь!

вот тебе пища для размышление
1)
Код

use IO::Socket;

$sock = new IO::Socket::INET (LocalHost => 'localhost',
                              LocalPort => 1200,
                              Proto     => 'tcp',
                              Listen    => 5,
                              Reuse     => 1                            
                             );

die "$!" unless $sock;

while ($new_sock = $sock->accept()) {
    while (defined ($buf = <$new_sock>)) {
       print $buf;
    }
}
close ($sock);

2)
Код

($port,$ipaddr) = sockaddr_in($new_sock->sockname());
$ipaddr = inet_ntoa($ipaddr);

3) для этого есть fork()

Автор: korob2001 13.5.2005, 17:30
Цитата

какие функции исспользуються для открытия портов и прослушивания их на предмет приёма.

chaos - на это вопрос ответил. Можно заюзать ещё модуль Socket, но IO::Socket всё же лучше.
Цитата

как определить IP клиента

Код

$ip = $ENV{ HTTP_X_FORWARDED_FOR } || $ENV{ REMOTE_ADDR };

Цитата

как держать такую программу всегда в памяти?

До тех пор, пока приложение "сервер" ждёт, оно и так висит в памяти.

Автор: wladk 16.5.2005, 13:35
Цитата

Как быстро нацарапать такой минисервер с админкомандой "die", к-я выгружает программу из памяти.


"быстро" или "правильно"? smile

Если "быстро" - не знаю, наверное искать что то готовое, если "правильно" то начать с "Эффективного програмирования TCP/IP" Йона Шнайдера(автора могу переврать), и продолжить "Разработка сетевых программ на PERL" Линкольн Д. Штайн. В обоих книках есть достаточно примеров, какой-то их них вполне можно будет взять за основу...

Цитата

Этап 3
как держать такую программу всегда в памяти?


А стоит ли? Посмотри на механиз работы с сендмейлом, к примеру. Он все время в памяти не висит, а "поднимается" системой при обращении к определнному порту...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)