Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > ПЕРЛ, чтение файлов и сокетов


Автор: procool 31.5.2002, 08:47
Привет.

пишу скрипт, который открывает unix-сокет с заданным именем, читает
из него построчно данные и пишет в файл. Причем именно построчно, вариант
@data = <SOCK>
не подойдет, потому что в сокет пишут данные быстро и он не кончается.
Можно в скрипте сделать переменную - сколько строк он будет считывать.

Вот в этом и вопрос.. Как осуществить построчное чтение из сокета???

Автор: Unregistered 13.1.2004, 09:57
ну я сто лет назад понял уже что надо делать через seek:)

Автор: acp 13.1.2004, 14:00
Цитата
Как осуществить построчное чтение из сокета

А что мешает самому интерпретировать входные данные как строки?
То есть, обнаружил символ окончания строки и вперёд...

Цитата
ну я сто лет назад понял уже что надо делать через seek:)

Можешь сказать - как? smile.gif

Автор: Бекетов Роман aka Yaiu 14.1.2004, 13:31
Вот пример из perldoc
Код

#!/usr/bin/perl -w

use Socket;
use strict;
my ($rendezvous, $line);

$rendezvous = shift || '/tmp/catsock';
socket(SOCK, PF_UNIX, SOCK_STREAM, 0)|| die "socket: $!";
connect(SOCK, sockaddr_un($rendezvous))|| die "connect: $!";

while (defined($line = <SOCK>)) {
   print $line;
}
exit;  

Автор: procool 25.4.2004, 06:53
Читаем из сокета:

Код
-bash-2.05b$ cat db
#!/usr/bin/perl -w
use Socket;
use POSIX qw(BUFSIZ setsid EWOULDBLOCK);


my $data_send = '';
for(@ARGV){$data_send .= $_." ";}
$data_send =~ s/^\s+//;
$data_send =~ s/\s+$//;
$data_read = '';
$uauth_socket_name = "/tmp/some.socket";

my $maxlen = 1000024;
my $flags  = 0;

print "operning socket...\n";
           socket(AUTHSERV, PF_UNIX, SOCK_STREAM, 0);
print "connecting to socket $uauth_socket_name\n";
           connect(AUTHSERV, sockaddr_un($uauth_socket_name)) || die("cannot con                                                                                     nect to $uauth_socket_name");
print "sending info to $uauth_socket_name: \n$data_send\n";
           send (AUTHSERV, $data_send, 0); # ÏÔÐÒÁ×ÌÑÀ ÐÅÒÅÍÅÎÎÕÀ Ó ÚÁÐÒÏÓÏÍ ÓÅÒ                                                                                     ×ÅÒÕ...
print "reading the answer...\n";
print "the answer is:\n";
        my $newdata = 1;
       while ($newdata) { my $tmp_data = ""; # читаем пока в сокете  хоть что-то есть...
           recv(AUTHSERV, $tmp_data, $maxlen, $flags);
           if (!$tmp_data) { $newdata = 0; }
           $data_read .= $tmp_data;
           print $tmp_data;
       }
print "\n===========================\nclosing socket $uauth_socket_name...\n";
close (AUTHSERV); # ÚÁËÒÙÌ ÓÏËÅÔ...
print "quit...\n";
-bash-2.05b$


Воть. думаю всё понятно.. как нить через пол годика зайду, посмотрю может что ответитеsmile.gif удачи)

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