【问题标题】:Simulating streaming data模拟流数据
【发布时间】:2012-05-17 07:48:22
【问题描述】:

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

有哪些更现实的方法来实现这一目标?我需要它根据模拟的硬件以可变速度流式传输。

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

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

【问题讨论】:

    标签: c perl stream simulation named-pipes


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      设置一个后台进程,以您想要的任何速率将文件写入套接字。在 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;
      }
      

      【讨论】:

      • 这看起来很完美——从不同进程的 $A 套接字读取是否简单?
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-24
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2020-05-17
        • 1970-01-01
        相关资源
        最近更新 更多