Lei parla di apertura di un file, e chiedere informazioni IO::Socket
. Queste non sono esattamente le stesse cose, anche se in fondo leggerai i dati di un descrittore di file.
Se è possibile accedere allo stream remoto da una named pipe o FIFO, è sufficiente aprirlo come un file normale. Bloccherà quando nulla è disponibile, e ritornerà ogni volta che ci sono dati che devono essere svuotati. È possibile, o meno, dover portare File::Tail
a sopportare il problema di non perdere dati se il mittente è troppo avanti.
D'altra parte, se si sta aprendo un socket direttamente all'altro server (che sembra più probabile), IO::Socket
non funzionerà correttamente poiché non è disponibile il metodo getline
. Dovresti leggere e bufferare blocco per blocco e poi distribuirlo riga per riga attraverso una penna intermedia.
È possibile estrarre il descrittore di socket in un IO::Handle
e utilizzare getline()
su quello.Qualcosa di simile:
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
}
Potrebbe essere necessario eseguire una stretta di mano, al fine di iniziare a ricevere i pacchetti, ma questa è un'altra questione.
http://stackoverflow.com/questions/915926/perl-read-new-records-added-to-a-file/915989#915989 – innaM