2015-10-08 2 views
0

Я пытаюсь отправить двоичный файл через сокет UDP в Perl:Perl: Чтение двоичного файла и отправить через гнездо

#!/usr/bin/perl 
use warnings; 
use strict; 
use IO::Socket; 
my $sock = IO::Socket::INET->new(
    Proto => 'udp', 
    PeerPort => 666, 
    PeerAddr => '127.0.0.1', 
) or die "Could not create socket: $!\n"; 

my $input; 
open $input, "result1.bin" or die "Unable to oen: $!"; 
binmode $input; 
my $data; 
my $nbytes; 
while($nbytes = read $input, $data, 32) { 
     print "$nbytes bytes read\n"; 
} 
my $res = $sock->send($data); 
print $res . "\n"; 

Мой выход:

32 bytes read 

32 bytes read 

16 bytes read 

0 

Почему вызов отправить не отправить байт?

+0

Вы распечатали '$ data' внутри и после вашего цикла, чтобы проверить, что было прочитано? – simbabque

+0

@ago, да. Я напечатал $ data after loop через print hexdump ({"data" => $ data}); В результате получилось: _Data :: Hexdumper: длина данных не является целым числом, кратным строкам , поэтому в конце было заполнено NULL. 0x0000: 48 41 53 48 28 30 78 31 35 37 63 34 34 30 29 00: HASH (0x157c440) _ – peroksid

+0

Если я изменяю $ data на «что-то строку или число», это работает. Очень странно. – peroksid

ответ

3

Проблема заключается в этой строке:

while($nbytes = read $input, $data, 32) { 

Поскольку вы не указываете offset, функция read хранит входные данные в начале $data в каждой итерации, перезапись ранее полученных данных. В последней итерации, когда нет данных для чтения, пустая строка сохраняется в $data, и цикл while завершается.

Поскольку размер $data равен 0, функция send не отправляет ничего.

Вот как вы можете исправить вызов read:

while($nbytes = read $input, $data, 32, length $data) { 

Update: Как уже упоминалось в комментариях, UDP не правильный подход и приведенный выше код может не работать, вы ожидаете, поскольку пакеты могут быть не по порядку или даже потерян.