Имитация потоковых данных

Я пытаюсь написать программу, которая будет читать из плоского файла данных и имитировать потоковую передачу, чтобы я мог протестировать программу, которая считывает потоковые данные без необходимости подключения и запуска потокового оборудования.

Каковы наиболее реалистичные способы сделать это? Мне это нужно для потоковой передачи с переменной скоростью в зависимости от имитируемого оборудования.

Мои две идеи на данный момент - это программа, которая пишет в именованный канал, или программа, которая пишет в виртуальный последовательный порт с той скоростью, которая мне нужна.

Есть ли лучший (более реалистичный) способ моделирования потоковых данных?

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 (формирователь полосы пропускания пространства пользователя).

Другие вопросы по тегам