模拟流数据

时间:2012-05-08 19:30:02

标签: c perl stream simulation named-pipes

我正在尝试编写一个程序,它将从平面数据文件中读取并模拟流式传输,这样我就可以测试一个读取流数据的程序,而无需连接和启动流式硬件。

有哪些更现实的方法可以实现这一目标?我需要它以可变速度流,这取决于我模拟的硬件。

到目前为止,我的两个想法是写入命名管道的程序,或者以我需要的速率写入虚拟串行端口的程序。

是否有更好的(更现实的)模拟流数据的方式?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

我会以最接近原始流数据源的方式模拟流。例如。如果您通常从网络套接字获取流,则使用网络套接字进行模拟;如果您有一个串口,那么使用虚拟串口等。否则,您需要一个适用于您的流消费者代码的适配器(但您已经知道我认为的所有这些)。

除此之外,您还需要一种速率限制算法,该算法允许您控制要发送的数据量。快速搜索引导我this,但肯定有更复杂和复杂的算法。 YMMV。

当然,您假设您知道如何为流的使用者创建有效的数据/数据包。

答案 2 :(得分:0)

您可以通过查看trickle(用户空间带宽整形器)来尝试保存一些编码时间。