我创建了简单的 tcp 服务器 - 它运行良好。
当我们切换到压力测试时,问题就开始了——因为我们的服务器应该处理许多并发打开的套接字——我们创建了一个压力测试来检查这一点。不幸的是,当并发打开的套接字数量在 100 左右时,看起来服务器阻塞并且无法及时响应新的连接请求。
我们已经尝试了几种类型的服务器 - 并且都产生相同的行为。
服务器:可以类似于这篇文章中的示例(都产生相同的行为)
这是我们正在使用的代码 - 当客户端连接时 - 服务器将挂起以保持套接字处于活动状态。
enter code here
公共类服务器
{
private static readonly TcpListener listener = new TcpListener(IPAddress.Any, 2060);
public Server()
{
listener.Start();
Console.WriteLine("Started.");
while (true)
{
Console.WriteLine("Waiting for connection...");
var client = listener.AcceptTcpClient();
Console.WriteLine("Connected!");
// each connection has its own thread
new Thread(ServeData).Start(client);
}
}
private static void ServeData(object clientSocket)
{
Console.WriteLine("Started thread " + Thread.CurrentThread.ManagedThreadId);
var rnd = new Random();
try
{
var client = (TcpClient)clientSocket;
var stream = client.GetStream();
byte[] arr = new byte[1024];
stream.Read(arr, 0, 1024);
Thread.Sleep(int.MaxValue);
}
catch (SocketException e)
{
Console.WriteLine("Socket exception in thread {0}: {1}", Thread.CurrentThread.ManagedThreadId, e);
}
}
}
压力测试客户端:是一个简单的 tcp 客户端,一个接一个地循环和打开套接字
class Program
{
static List<Socket> sockets;
static private void go(){
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("11.11.11.11"), 2060);
try
{
newsock.Connect(iep);
}
catch (SocketException ex)
{
Console.WriteLine(ex.Message );
}
lock (sockets)
{
sockets.Add(newsock);
}
}
static void Main(string[] args)
{
sockets = new List<Socket>();
//int start = 1;// Int32.Parse(Console.ReadLine());
for (int i = 1; i < 1000; i++)
{
go();
Thread.Sleep(200);
}
Console.WriteLine("press a key");
Console.ReadKey();
}
}
}
有没有简单的方法来解释这种行为?如果 TCP 服务器会产生更好的结果,也许 c++ 实现?也许这实际上是一个客户端问题?
欢迎任何评论!
提供