【问题标题】:Poor UDP broadcast performance to multiple processes on same PC同一台 PC 上多个进程的 UDP 广播性能不佳
【发布时间】:2011-12-24 16:19:52
【问题描述】:

我们有一个应用程序使用 UDP 将数据从服务器系统广播到运行在多台 Windows XP PC 上的客户端应用程序。这是在 LAN 上,通常是千兆位。这几年来一直运行良好。

我们现在需要在每台四核 PC 上运行两个(或更多)客户端应用程序,每个应用程序实例都接收广播数据。我用来实现这一点的方法是为每个客户端 PC 提供多个 IP 地址。然后,每个客户端应用程序使用相同的端口号但在不同的 IP 上连接到服务器。这在功能上有效,但由于某种原因性能非常差。我的数据传输率降低了大约 10 倍!

为了获得多个 IP 地址,我尝试了使用两个 NIC 适配器并在高级 TCP/IP 网络属性中将多个 IP 地址分配给单个 NIC。这两种方法似乎都给出了同样糟糕的性能。我也尝试过使用几种不同制造商的 NIC,但这也无济于事。

我确实注意到的一件事是,数据似乎更加分散。如果我向客户端发送 20kBytes 的数据,PC 上只有一个客户端,它几乎总是以一个块的形式接收所有数据。但是在两个客户端运行时,数据似乎大多以帧大小(1500 字节)的块形式出现,因此我的代码必须迭代更多次。但我不认为这本身会造成如此巨大的性能冲击。

所以我想我的问题是有人知道为什么性能会这么慢吗?是否可以采取任何措施来加快速度?

我知道我可以重新设计一些东西,使服务器只向每台 PC 的一个客户端发送数据,然后该客户端可以将数据镜像到同一台 PC 上的其他客户端。但这是一项重大的重新设计和重新编码工作,所以我想把它作为最后的手段。

【问题讨论】:

  • 为什么要广播而不是多播?为什么你需要对 IP 地址进行奇怪的破解?

标签: sockets udp winsock broadcast multihomed


【解决方案1】:

不要为每个客户端创建一个 IP 地址,而是尝试使用 setsockopt() 为每个套接字启用 SO_REUSEADDR 选项。这将允许您的所有客户端绑定到同一主机地址上的同一端口并接收广播数据。应该比多 NIC/IP 地址方法更易于管理。

SO_REUSEADDR 将允许广播和多播套接字共享相同的端口和地址。有关更多信息,请参阅: SO_REUSEADDR and UDP behavior in WindowsUses of SO_REUSEADDR?

【讨论】:

  • 谢谢。我以前试过这个,但应用程序刚刚挂起。我没有编写应用程序,但我相信使用相同 IP 地址的其他网络流量在共享时会变得混乱。我会进一步研究它,看看我是否可以让它工作。
猜你喜欢
  • 2014-02-12
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
相关资源
最近更新 更多