Я создал простой tcp сервер - он работает довольно хорошо.
проблема начинается, когда мы переключаемся на стресс-тесты - поскольку наш сервер должен обрабатывать много одновременных открытых сокетов - мы создали стресс-тест, чтобы проверить это.
к сожалению, похоже, что сервер задыхается и не может своевременно ответить на новый запрос на подключение, когда число одновременных открытых сокетов составляет около 100.
мы уже пробовали несколько типов серверов - и все они работают одинаково.
сервер: может быть что-то вроде примеров в этом посте (все выдают одинаковое поведение)
Как написать масштабируемый сервер на основе Tcp / Ip
вот код, который мы используем - когда клиент подключается - сервер просто зависнет, чтобы сохранить сокет живым.
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();
}
}
}
Есть ли простой способ объяснить это поведение? Может быть, реализация C ++, если TCP-сервер будет давать лучшие результаты? может быть, это на самом деле проблема на стороне клиента?
Любой комментарий будет приветствоваться!
Офер