Вы говорите об открытии файла, и спросить о IO::Socket
. Это не совсем то же самое, даже если вы глубоко читаете данные дескриптора файла.
Если вы можете получить доступ к удаленному потоку из именованного канала или FIFO, вы можете просто открыть его как обычный файл. Он будет блокироваться, когда ничего не будет доступно, и возвращаться всякий раз, когда есть данные, которые необходимо удалить. Вы можете или не должны приносить File::Tail
проблемы с потерей данных, если отправитель слишком далеко впереди вас.
С другой стороны, если вы открываете сокет непосредственно на другой сервер (что кажется более вероятным), IO::Socket
не будет работать из коробки, поскольку нет способа getline
. Вам нужно будет читать и буферизовать блок-за-блоком, а затем выкладывать его по строкам через промежуточное удерживающее перо.
Вы можете вытащить дескриптор сокета в IO::Handle
и использовать на нем getline()
.Что-то вроде:
my $sock = IO::Socket::INET->new(
PeerAddr => '172.0.0.1',
PeerPort => 1337,
Proto => 'tcp'
) or die $!;
my $io = new IO::Handle;
$io->fdopen(fileno($sock),"r") or die $!;
while (defined(my $data = $io->getline())) {
chomp $data;
# do something
}
Вы, возможно, придется выполнить рукопожатие, чтобы начать получать пакеты, но это другое дело.
http://stackoverflow.com/questions/915926/perl-read-new-records-added-to-a-file/915989#915989 – innaM