我们有一个应用程序,它使用UDP从服务器系统广播数据到运行在多台Windows XP PC上的客户端应用程序。这是一个局域网,通常是千兆局域网。这台机器已经正常运行好几年了。
我们现在需要在每个四核PC上运行两个(或更多)客户端应用程序,每个应用程序实例都接收广播数据。我用来实现这一点的方法是给每个客户端PC多个IP地址。然后,每个客户端应用程序使用相同的端口号,但在不同的IP上连接到服务器。这在功能上是有效的,但由于某些原因,性能非常差。我的数据传输速率降低了大约10倍!
为了获得多个IP地址,我尝试使用两个网卡适配器并在高级TCP/IP网络属性中将多个IP地址分配给单个网卡。这两种方法的性能似乎都很差。我还试过使用几个不同的制造商的网卡,但也没有帮助。
我注意到的一件事是数据似乎更碎片化。如果在PC上只有一个客户端,如果我向客户端发送20kBytes的数据,它几乎总是在一个块中接收到所有数据。但是在两个客户端运行的情况下,数据似乎大多是在一个帧(1500字节)大小的块中传递的,所以我的代码必须迭代更多次。但我没想到这本身会造成如此戏剧性的性能冲击。
所以我想我的问题是,有没有人知道为什么性能这么慢,如果有什么可以加快它?
我知道我可以重新设计一些东西,这样服务器只向每台PC上的一个客户端发送数据,然后该客户端可以将数据镜像到同一台PC上的其他客户端。但这是一个主要的重新设计和重新编码的努力,所以我想把它作为最后的手段。
尝试使用setsockopt()为每个套接字启用SO_REUSEADDR选项,而不是为每个客户端创建一个IP地址。这将允许所有客户端绑定到同一主机地址上的同一端口并接收广播数据。应该比多网卡/IP地址方式更容易管理。
SO_REUSEADDR允许广播和多播套接字共享相同的端口和地址。更多信息请参见:SO_REUSEADDR和UDP在Windows中的行为和SO_REUSEADDR?