2

午後、

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();
4

1 に答える 1

4

あなたのコードはすでにファイルをチャンクに分割しています。<FILE>各チャンクを呼び出すことで、1 行になります。しかし、いくつかの問題があります。

  • 行が長くなりすぎてパケットに収まらない場合、転送できません
  • UDP は配信を保証しないため、受信者はデータを欠落したり、データを複製したりする可能性があります
  • UDP は配信の順序を保証しないため、受信者は後のデータを最初に取得する可能性があります

これらの欠点はファイル転送ではおそらく受け入れられないため、それらを回避するには、UDP の上にレイヤーを追加する必要があります。たとえば、重複を検出するためのシーケンス番号と、失われたデータの再送信をトリガーするための並べ替えと確認応答です。または、これらすべてがすでに組み込まれている TCP を代わりに使用することもできます。

于 2014-03-09T19:23:55.960 に答える