在Perl中通过UDP发送文件

生锈的

下午,

我在Perl中编写了一个小型UDP客户端/服务器,并且在发送文件时遇到了一些问题。我知道我需要将文件分解成块(数据报)并将其发送到服务器。

我一直在努力弄清楚如何将文件分解为数据报并发送。到目前为止,我可以很好地建立UDP连接,服务器会在收到UDP数据包时进行报告。这是我到目前为止所拥有的,任何帮助将不胜感激!

服务器:

#!/usr/bin/perl

# Flushing to STDOUT after each write
$| = 1;

use warnings;
use strict;
use IO::Socket;

# Server side information
my $listen_port     = 7070;
my $protocal        = 'udp';
my $received_data   = undef;

# Creating UDP socket for server
my $server = IO::Socket::INET->new (
    LocalPort   => $listen_port,
    Proto       => $protocal,
    Type        => SOCK_DGRAM
) or die "Socket could not be created, failed with error $!\n";

print "Waiting for client connection on port $listen_port\n";

open(FILE, ">output.UDP")
  or die "File can not be opened: $!";

while($server->recv($received_data, 1024)) {
    my $peer_address = $server->peerhost();
    my $peer_port    = $server->peerport();
    print "Message was received from: $peer_address, $peer_port\n";
    print FILE "$received_data";
}
close FILE;

print "Closing socket...\n";
$server->close();

客户:

#!/usr/bin/perl

# Flushing to STDOUT after each write
$| = 1;

use warnings;
use strict;
use IO::Socket;

# Client side information
my $host        = 'apollo.cselabs.umn.edu';
my $port        = 7070;
my $protocal    = 'udp';
my $datagram    = undef;

# Creating UDP socket for client
my $client = IO::Socket::INET->new (
    PeerAddr    => $host,
    PeerPort    => $port,
    Proto       => $protocal,
    Type        => SOCK_DGRAM
) or die "Socket could not be created, failed with error: $!\n";

# Open and specified file
open(FILE, "10MBfile.dat")
    or die "Fine can not be opened: $!";
$client->send("test");

# Send file line by line
while (<FILE>) {
    $datagram = $_;
    $client->send("$datagram");
}
close FILE;
# sleep(10);
$client->close();
斯蒂芬·乌尔里希(Steffen Ullrich)

您的代码已将文件拆分为多个块。通过调用<FILE>每个块将是一行。但是有几个问题:

  • 如果线路太长而无法放入数据包中,则无法传输
  • UDP不保证传递,因此您的接收者可能会丢失数据,甚至可能重复数据
  • UDP不保证传送顺序,因此您的接收者可能会先获取以后的数据

这些缺点在文件传输中可能是无法接受的,因此您需要在UDP之上添加层来解决它们,例如,序列号以检测重复,并重新排序和确认以触发对丢失数据的重新提交。或者,您可以简单地使用TCP,而TCP已经内置了所有这些功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Java中通过udp发送对象

来自分类Dev

通过UDP发送DatagramPacket

来自分类Dev

在C ++中通过UDP发送整数数组

来自分类Dev

在 C 中通过 UDP 在结构中发送动态数组

来自分类Dev

通过UDP发送XML数据

来自分类Dev

通过UDP发送XML数据

来自分类Dev

通过 UDP 发送的整数是字节

来自分类Dev

在PHP中通过SOAP发送Zip文件

来自分类Dev

通过bestream中的curl发送文件

来自分类Dev

在 .Net 中通过 TCP 发送大文件

来自分类Dev

udp打孔后发送文件

来自分类Dev

通过UDP发送非文本文件不起作用

来自分类Dev

将通过 UDP 发送的方法更改为通过 TCP 发送

来自分类Dev

Android通过UDP发送字符串

来自分类Dev

套接字-UDP通过Internet发送数据

来自分类Dev

通过UDP发送浮点数的结构

来自分类Dev

使用boost :: asio通过UDP发送结构

来自分类Dev

通过UDP套接字发送数据

来自分类Dev

如何访问通过UDP发送的数据?

来自分类Dev

通过UDP连接(网桥)发送数据

来自分类Dev

通过WebRequest发送文件

来自分类Dev

通过serversocket发送文件

来自分类Dev

通过netcat发送文件

来自分类Dev

通过rabbitmq发送文件

来自分类Dev

如何在C中通过udp套接字发送整数数组?

来自分类Dev

使用C#中的Avro框架通过UDP客户端发送流obj

来自分类Dev

在 C++ 中通过 UDP 套接字发送 struct、float 和 int

来自分类Dev

如何获取Laravel 4中通过POST发送的文件的内容?

来自分类Dev

如何在Android中通过MMS发送VCF文件