我正在尝试通过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
为什么发送呼叫不发送字节?
答案 0 :(得分:3)
问题出在这一行:
while($nbytes = read $input, $data, 32) {
由于您未指定offset,read
函数会在每次迭代中将输入数据存储在$data
的开头,从而覆盖先前的数据。在最后一次迭代中,当没有数据要读取时,空字符串存储在$data
中,而while循环退出。
由于$data
的大小为0,send
函数不会发送任何内容。
以下是如何解决对read
的调用问题:
while($nbytes = read $input, $data, 32, length $data) {
更新:正如评论中所提到的,UDP不是正确的方法,上述代码可能无法正常工作,因为数据包可能会出现故障甚至丢失。