1

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

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

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

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

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

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

4

1 回答 1

1

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

SO_REUSEADDR 将允许广播和多播套接字共享相同的端口和地址。有关更多信息,请参阅: Windows 中的 SO_REUSEADDR 和 UDP 行为 以及 SO_REUSEADDR 的使用?

于 2011-11-10T01:36:20.080 回答