|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 16 Jan 2002 17:55:55 To : Serg N. Yakovlev Subject : Re: IO::Socket ??? и fork()??? -------------------------------------------------------------------------------- Serg N. Yakovlev wrote: > Привет! > Вот пытаюсь пример воспризвести. > Хочется, открыв соединение и передав команду, получить обратно ответ. Hа том > конце киска с модемами и при подключении на порт линии и команде "at", дает > "ОК" > Hо в данном случае не происходит! Подскажите почему. Пример взят почти из > примеров "Perl Cookbook". Код: > ---------open > #!/usr/bin/perl > # > # > use strict; > use IO::Socket; > my ($host, $port, $comd, $kidpid, $handle, $line); > > $host = "192.168.1.29"; > $port = "2002"; > $comd = "at"; > > $handle=IO::Socket::INET->new( Proto=>"tcp", > PeerAddr=>$host, > PeerPort=>$port, > Timeout=>5, > Type=>SOCK_STREAM); > #$handle->$autoflush(1); <-------------------------почемуто при > отладке ругается??? Потому, что правильно: $handle->autoflush(1); > #print STDERR "[Connect to $host:$port]\n"; > > die "can't fork: $!" unless defined($kidpid=fork()); > > if ($kidpid) > { > while (defined ($line = <$handle>)) > { > # print STDOUT $line; > print $comd $line; Этот print пытается выдать строку $line в файл с дескриптором $comd. Которого конечно же не существует. Правильным было бы print "$comd $line" но смысл этого мне не ясен. Зачем выводит 'at ' себе же на экран перед выводом ответа? > } > kill("TERM" => $kidpid); > } > else{ > while (defined ($line = <STDIN>)) > { > print $handle $line; Вот может быть здесь хотелось print $handle "$comd$line"; ? > } > } > exit; Кстати: 1. Уверены ли Вы в том, что каждая строка ответа заканчивается принятым в данной ОС символом \n? В противном случае построчное чтение не будет работать. (Хинт: возможно придется изменить $/ в "родительской" ветви и вдобавок сделать STDOUT->autoflush(1)) 2. Уверены ли Вы в том, что посылаемые команды содержат "правильный" (с точки зрения протокола, а не ОС) конец строки? (Хинт: $line =~ s/\n$/\x0D\x0D/) 3. Если вы закроете STDIN (например ^D в unix), кто убъет родетельский процесс? (Хинт: kill("TERM" => getppid())) Андрей --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/52844fda0dfc.html, оценка из 5, голосов 10
|