最高效的winsock设计,适用于高负载网络应用

时间:2009-07-07 12:47:20

标签: c serialization winsock

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

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

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

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

提前致谢,

此致

2 个答案:

答案 0 :(得分:1)

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

如果这样做,可能会丢失一些UDP数据包(由网络丢弃),因此您的代码需要一种方法(例如数据包标头中的序列号)来检测丢失的数据包。

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

这取决于应用程序:

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

    < / LI>
  • 您是否正在直播视频,您希望以近乎实时的方式显示当前帧(即使之前的某些帧丢失,您也不希望在重新传输时延迟)?


就winsock体系结构而言,TransmitFileTransmitPackets API非常有效:它们在内核中执行,而不是导致用户模式代码和O / S内核模式之间的往返传输每个缓冲区的代码。


  实现“最小延迟”目标

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

答案 1 :(得分:0)

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

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

最快的API是无聊的旧阻止“发送”和“recv”调用(* 1)。还有其他调用Windows IO类型完成端口和诸如此类的东西;不要将它们用于此应用程序(因为(a)它们是过度的,(b)它们使应用程序更具可扩展性)

考虑关闭Nagle(NODELAY选项)。

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