0

我知道这是一个普遍的问题,但我需要您对 TCP 服务器/客户端应用程序的建议。

服务器一次只应该处理一个连接。服务器正在向连接的客户端发送实时图像(一帧约为 50K 和每秒 20 帧)。

实际上,在服务器和客户端应用程序启动时,连接就建立了,理论上这个连接应该永远保持活动状态。

我的观点是,由于服务器正在发送实时图像,延迟必须是最小的,那么编写这样一个(简单的)tcp 服务器和客户端的最佳实践是什么,以及如何序列化/反序列化图像以实现“最小延迟”的目标?

提前致谢,

问候

4

2 回答 2

1

一种方法是使用 UDP 而不是 TCP 发送数据。

如果你这样做了,一些UDP数据包可能会丢失(被网络丢弃),所以你的代码需要一个方法(例如数据包头中的序列号)来检测丢失的数据包。

如果 TCP 数据包丢失,则 TCP 将重新传输它,这会导致延迟。对于您的应用程序,当一个数据包丢失时,您可能只想不丢失该丢失的数据包,不重新传输它,不显示此视频帧(或仅显示部分帧),然后继续显示下一个框架。

这取决于应用程序:

  • 您是否正在流式传输罐装/预录/非实时视频,您希望接收/显示每一帧,即使其中一些会导致延迟?

  • 您是否正在流式传输实时视频,您想在其中近乎实时地显示当前帧(即使之前的一些帧丢失了,您也不想在重新传输它们时延迟)?


在 winsock 架构方面,TransmitFileTransmitPacketsAPI 非常高效:它们在内核中执行,而不是在传输每个缓冲区时导致用户模式代码和 O/S 内核模式代码之间的往返。


达到“最小延迟”目标

您可能需要一些延迟以避免抖动:最好有一个小的(例如 150 毫秒)固定延迟,而不是从 2 到 120 毫秒变化的延迟。请参阅http://www.google.ca/search?hl=en&q=jitter+network

于 2009-07-07T12:57:44.890 回答
0

我不是超级权威,但是...

让我们做一些数学运算。每秒 20 帧的每张图像 50K(这是字节,对吗?)大约是每秒 1 兆字节。在通信方面,这是每秒 10 兆比特。这是一个公平的位,但非常可行。确保您始终拥有 100 兆位的设备。

最快的 API 是无聊的旧阻塞“发送”和“接收”调用 (*1)。还有其他调用可以执行 Windows IO 类型的完成端口等等;不要在此应用程序中使用它们(因为(a)它们太过分了,并且(b)它们使应用程序更具可扩展性)

考虑关闭 Nagle(NODELAY 选项)。

(*1) 可能。关于实际最快的 Winsock 调用的实际文献严重缺乏。

于 2009-07-10T18:05:45.410 回答