对同一台PC上的多个进程的UDP广播性能较差

时间:2011-11-08 17:39:57

标签: sockets udp winsock broadcast multihomed

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

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

为了获得多个IP地址,我尝试使用两个NIC适配器并为高级TCP / IP网络属性中的单个NIC分配多个IP地址。这两种方法似乎同样表现不佳。我也试过使用几种不同的制造商NIC,但这也没有用。

我注意到的一件事是,数据似乎更加分散。如果我在PC上只有一个客户端,如果我向客户端发送20kBy数据,它几乎总是在一个块中接收它。但是,运行数据的两个客户端似乎主要是以帧大小(1500字节)的块来实现,因此我的代码必须迭代更多次。但我不会指望这会导致如此戏剧性的表现。

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

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

1 个答案:

答案 0 :(得分:1)

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

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