我最近在C# .NET Framework 4.0中遇到了一个奇怪的情况:
在一个简单的程序中,我创建了一个 TcpListener,指定它的本地端口,启动它并使用异步接受函数来接收传入的连接请求。
一旦它有待处理的入站连接,服务器就会从异步回调函数中接受 TcpClient 并将其记录到容器中(更具体地,a List<TcpClient>
)。
我编写了另一个简单的客户端程序,它一旦启动就连接到服务器,然后调用异步接收函数。
连接所有客户端后,服务器使用System.Threading.Tasks.Parallel.ForEach()
.
在每个任务中,我使用存储在该列表中的 TcpClient 将数据发送到相应的客户端。所有 TcpClients 都在同时发送数据(我检查了客户端,它们都在接收数据)。数据只是byte[8192]
服务器程序启动时生成的随机数据。我让服务器重复发送它。
客户端的接收回调很简单。一旦数据到达,客户端只是忽略数据并运行另一个异步接收函数。
测试环境是一个1Gbps 的 LAN、一台服务器和几个客户端。
结果是:无论有多少个客户端(从 3 ~ 8 个)连接到服务器,服务器的总上传速度永远不会超过13MByte/
s。
然后我尝试了另一种方法:
我也在客户端创建了一个TcpListener。一旦客户端连接到服务器,服务器也会连接到客户端的监听端口。然后服务器会将这个传出连接存储到列表中,而不是传入连接。
这一次,测试结果变化很大:当3个客户端从服务器接收数据时,服务器的总上传速度接近30MByte/s
;有 5 个客户端,总上传速度接近50MBytes/s
.
虽然这个10MByte/s-per-client
限制可能是由于硬件或网络配置,但它仍然比上述情况好得多。
有谁知道为什么?