привет!
написал простой tcp-сервер на perl, который вешается на порт и принимает подключения...
хочу что бы он не висел как демон а только запускался при когда ето надо, и если приходит другое подключение то запускалась его копия, короче через inetd.
прописал в inetd.conf, в service, все ОК! но когда пытаюсь подключиться, сервак то пытается повеситься на порт, а там уже слушает inetd
что делать? может не надо вешать сервак на порт? а от куда тогда брать данные от клиента?
>привет!
>написал простой tcp-сервер на perl, который вешается на порт и принимает подключения...
>
>хочу что бы он не висел как демон а только запускался при
>когда ето надо, и если приходит другое подключение то запускалась его
>копия, короче через inetd.
>прописал в inetd.conf, в service, все ОК! но когда пытаюсь подключиться,
>сервак то пытается повеситься на порт, а там уже слушает inetd
>
>что делать? может не надо вешать сервак на порт? а от куда
>тогда брать данные от клиента?через inetd не надо слушать порт. Там надо делать 2 вещи:
1. при необходимости, отключить буферизацию у stdout.
2. читать и писать в stdin/stdout соответственно.
И не надо создавать сокетов и т.д. и т.п.
>>привет!
>>написал простой tcp-сервер на perl, который вешается на порт и принимает подключения...
>>
>>хочу что бы он не висел как демон а только запускался при
>>когда ето надо, и если приходит другое подключение то запускалась его
>>копия, короче через inetd.
>>прописал в inetd.conf, в service, все ОК! но когда пытаюсь подключиться,
>>сервак то пытается повеситься на порт, а там уже слушает inetd
>>
>>что делать? может не надо вешать сервак на порт? а от куда
>>тогда брать данные от клиента?
>
>через inetd не надо слушать порт. Там надо делать 2 вещи:
>1. при необходимости, отключить буферизацию у stdout.
>2. читать и писать в stdin/stdout соответственно.
>И не надо создавать сокетов и т.д. и т.п.
каким образомотключить буферизацию?
>
>каким образомотключить буферизацию?как обычно:
select(( select, $| = 1 )[0] );
иначе, интерактивность будет не очень.
>
>как обычно:
>select(( select, $| = 1 )[0] );
> иначе, интерактивность будет не очень.и еще вопросик:
а если мне надо принимать данные построчно, то как лучше делать?
>и еще вопросик:
>а если мне надо принимать данные построчно, то как лучше делать?если у тебя программы собираются общаться строка - 1-й комп, строка - 2-й комп и т.д. по кругу, то буферизацию надо отключать.
все ясно! разобрался! спасибо!а как узнать ip с котрого пришел коннект?
ОК! с ip все понятно!
я получаю строку вот так -
$line = <STDIN>;как мне ограничить ограничить эту строку? т.е. получать только первые 20 символов! что бы не было переполнения
>ОК! с ip все понятно!
>я получаю строку вот так -
>$line = <STDIN>;
>
>как мне ограничить ограничить эту строку? т.е. получать только первые 20 символов!
>что бы не было переполненияСлышал звон, да не знаю где он. Какого переполнения? В данном случае не возникнет никакого переполнения.
Для чтения 20 символов используйте:
perldoc -f sysreadps: и настоятельно рекомендую начать с perldoc perlintro
>что делать? может не надо вешать сервак на порт? а от куда
>тогда брать данные от клиента?Не надо вешать. Данные брать с stdin, отправлять на stdout. Остальное - забота inetd.
И вроде последний вопрос:
клиент приконекчивается, я жду от него строку
sysread(STDIN,128);но так ждать я могу без конечно!
как сделать что бы сервак через определенное время отваливался?
perldoc -f alarm
(пример в самом конце, из него всё понятно)
>perldoc -f alarm
>(пример в самом конце, из него всё понятно)
Большое спасибо!