Отправка файла через UDP в Perl
После полудня,
Я пишу небольшой UDP-клиент / сервер на Perl, и у меня возникают проблемы с отправкой файлов. Я понимаю, что мне нужно разбить файл на куски (дейтаграммы) и отправить их на сервер.
Я застрял, пытаясь понять, как разбить файл на дейтаграммы и отправить их. На данный момент я могу установить соединение 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();
1 ответ
Ваш код уже разбивает файл на куски. По телефону <FILE>
каждый кусок будет одной строкой. Но есть несколько проблем:
- Если строка становится слишком длинной и не помещается в пакет, она не может быть передана
- UDP не гарантирует доставку, поэтому ваш получатель может пропустить данные или даже дублировать данные
- UDP не гарантирует порядок доставки, поэтому ваш получатель может сначала получить более поздние данные
Эти недостатки, вероятно, неприемлемы при передаче файлов, поэтому вам нужно добавить слои поверх UDP, чтобы обойти их, например, порядковые номера для обнаружения дубликатов и переупорядочения, а также подтверждения для запуска повторной отправки потерянных данных. Или вы можете просто использовать вместо этого TCP, который уже содержит все это и многое другое.