2011-11-08 79 views
1

我們有一個應用程序,它使用UDP從服務器系統向運行在多臺Windows XP PC上的客戶端應用程序廣播數據。這是在一個局域網上,通常是千兆位。這幾年來運行良好。對同一臺PC上的多個進程的UDP廣播性能不佳

我們現在需要在每臺四核電腦上運行兩個(或更多)客戶端應用程序,每個應用程序實例都接收廣播數據。我用來實現這個的方法是給每個客戶端PC多個IP地址。然後,每個客戶端應用程序使用相同的端口號連接到服務器,但使用不同的IP。這在功能上起作用,但由於某些原因,性能非常差。我的數據傳輸速率降低了10倍!

獲取多個IP地址我已經嘗試使用兩個NIC適配器並將多個IP地址分配給高級TCP/IP網絡屬性中的單個NIC。這兩種方法似乎都表現出差不多的表現。我也嘗試過使用幾個不同的製造商網卡,但這也沒有幫助。

我曾經注意到的一件事是數據似乎會變得更加分散。如果我將20kBytes的數據發送到客戶端,只需一臺個人電腦上的客戶端,它幾乎總能將所有數據全部接收到客戶端。但是有兩個客戶端運行數據似乎大部分都是以一個幀的大小(1500字節)來完成的,所以我的代碼需要迭代多次。但我不希望這會導致如此戲劇性的表現。

所以我想我的問題是否有人知道爲什麼表現如此之慢,如果有什麼可以做到加快速度?

我知道我可以重新設計一些東西,以便服務器只向每臺PC的一個客戶端發送數據,然後客戶端可以將數據鏡像到同一臺PC上的其他客戶端。但這是一個重大的重新設計和重新編碼工作,所以我想保留這個作爲最後的手段。

+0

爲什麼廣播而不是多播?爲什麼你需要使用IP地址的奇怪黑客? –

回答

1

不是爲每個客戶端創建一個IP地址,而是嘗試使用setsockopt()爲每個套接字啓用SO_REUSEADDR選項。這將允許您的所有客戶端綁定到相同主機地址上的相同端口並接收廣播數據。應該比多種NIC/IP地址方式更容易管理。

SO_REUSEADDR將允許廣播和多播套接字共享相同的端口和地址。欲瞭解更多信息,請參閱: SO_REUSEADDR and UDP behavior in WindowsUses of SO_REUSEADDR?

+0

謝謝。我以前嘗試過,但應用程序只是掛起。我沒有編寫應用程序,但我相信有一些其他網絡流量使用相同的IP地址,在共享時會混淆。我會進一步研究它,看看我能否實現它。 – Techtonic