让netcat成为一个“流”

让netcat成为一个“流”

因此,我正在做一个简单的实验,让netcat您可以在其中设置语音通话。这是我正在使用的命令。

服务器: arecord | netcat -l 10000 | aplay

客户: arecord | netcat localhost 10000 | aplay

我的问题是,当服务器在客户端连接之前几秒钟启动时,语音会从服务器延迟。我想知道如何消除这种延迟。我很确定我只需要在 中设置一些值netcat,但我不确定要设置哪些值。

我用过UDP和TCP。两者没有什么区别。

答案1

我怀疑你的 shell 缓冲arecord输出之前netcat能够进一步传递它(即客户端连接时)。要确认,请尝试:

arecord | pv | netcat -l 10000 | aplay

在我的 Ubuntu 中pvarecord即使没有连接到netcat.您可能怀疑这个缓冲区是由 实现的pv,但它不依赖于pv -B选项,所以我认为它是 shell 的管道缓冲区。

我尝试使用stdbufand unbuffer(后者来自expect-dev我的 Ubuntu 中的包),但结果并不令人满意。

dd当我用来刷新足够的数据时,我取得了显着的进步在客户端

arecord | netcat localhost 10000 | { dd bs=100K count=1 iflag=fullblock of=/dev/null; aplay; }

对我来说100K就足够了;您的里程数可能会有所不同。请注意dd,如果您运行命令太快(在服务器端缓冲区已满之前)或者参数bs=…太大,您将必须等待几秒钟才能完成。

答案2

使用 TCP 时,“保证”连接不会丢失数据。在您的情况下,您可能不希望这样做,因为您的客户端和服务器避免丢失数据的唯一方法是将其排队等待交付。

对于两个系统,您可以切换为使用 UDP。由于这是无连接的,因此您不会将第一个数据包排队,但它们确实会被丢弃。我目前无法对此进行测试,但我建议您尝试以下操作:

系统 1 上的服务器

arecord | nc -u -l -p 10000 | aplay

系统 2 上的客户端

arecord | nc -u system1 10000 | aplay

相关内容