Вы говорите об открытии файла и спрашиваете о 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
}
Возможно, вам придется выполнить рукопожатие, чтобы начать прием пакетов, но это другое дело.