Имитация потоковых данных
Я пытаюсь написать программу, которая будет читать из плоского файла данных и имитировать потоковую передачу, чтобы я мог протестировать программу, которая считывает потоковые данные без необходимости подключения и запуска потокового оборудования.
Каковы наиболее реалистичные способы сделать это? Мне это нужно для потоковой передачи с переменной скоростью в зависимости от имитируемого оборудования.
Мои две идеи на данный момент - это программа, которая пишет в именованный канал, или программа, которая пишет в виртуальный последовательный порт с той скоростью, которая мне нужна.
Есть ли лучший (более реалистичный) способ моделирования потоковых данных?
3 ответа
Настройте фоновый процесс, который записывает файл в сокет с любой скоростью, которую вы хотите. В Perl
use Socket;
socketpair my $A, my $B, AF_UNIX, SOCK_STREAM, PF_UNSPEC;
if (fork() == 0) {
stream();
exit;
}
while (<$A>) {
print;
}
sub stream {
# output 1024 bytes/sec
select $B; $| = 1; # disable output buffering
open my $fh, '<', '/file/to/stream';
my $buffer;
while (my $n = read $fh, $buffer, 1024) {
sleep 1;
print $B $buffer;
}
close $fh;
}
Я бы пошел с имитацией потока способом, наиболее близким к исходному источнику данных потока. Например, если вы обычно получаете свой поток из сетевого сокета, то используйте симуляцию сетевого сокета; если у вас есть последовательный порт, то используйте виртуальный последовательный порт и т. д. В противном случае вам понадобится адаптер для кода потребителя потока (но вы уже знаете все это, я полагаю).
Помимо этого вам понадобится алгоритм ограничения скорости, который позволит вам контролировать объем передаваемых данных. Быстрый поиск привел меня к этому, но есть, конечно, более сложные и изощренные алгоритмы. YMMV.
Это предполагает, конечно, что вы знаете, как создавать действительные данные / пакеты для потребителя вашего потока.
Вы можете попытаться сэкономить немного времени на кодирование, взглянув на trickle (формирователь полосы пропускания пространства пользователя).