Perl:读取二进制文件并通过套接字发送

时间:2015-10-08 11:14:36

标签: perl sockets

我正在尝试通过Perl中的UDP套接字发送二进制文件:

#!/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

为什么发送呼叫不发送字节?

1 个答案:

答案 0 :(得分:3)

问题出在这一行:

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

由于您未指定offsetread函数会在每次迭代中将输入数据存储在$data的开头,从而覆盖先前的数据。在最后一次迭代中,当没有数据要读取时,空字符串存储在$data中,而while循环退出。

由于$data的大小为0,send函数不会发送任何内容。

以下是如何解决对read的调用问题:

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

更新:正如评论中所提到的,UDP不是正确的方法,上述代码可能无法正常工作,因为数据包可能会出现故障甚至丢失。