Witajcie, mam problem z serwerem TCP/IP.
Chcę stworzyć symulator urządzenia które będzie na jakimś porcie. Jednak tych urządzeń ma być X. Sęk w tym, że utworzenie 4 serwerów to ułamek sekundy, ale już każdy kolejny otwiera się w ok. sekundę co przy dużej ilości symulacji trochę utrudnia sprawę. Aby lepiej to przedstawić zrobiłem mały program:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace TestServer
{
class Program
{
private static DateTime StartDate;
private static int ServerCouneter = 20;
private static List<Server> Servers;
static void Main(string[] args)
{
Servers = new List<Server>();
for (var i = 0; i < ServerCouneter; i++)
{
Servers.Add(new Server(i));
}
Console.WriteLine("Wciśnięcie dowolnego klawisza rozpocznie uruchamianie serwerów - " + ServerCouneter);
Console.ReadKey();
StartDate = DateTime.UtcNow;
Task.Run(RunServers).Wait();
for (var i = 0; i < Servers.Count; i++)
{
Servers[i].Stop();
}
Console.WriteLine("Koniec");
}
private static async Task RunServers()
{
var res = Parallel.For(0, Servers.Count, (i) => {
Task.Run(Servers[i].Start);
});
while (ServerCouneter > 0 || !res.IsCompleted)
{
await Task.Delay(1);
}
}
public static void StartServer(int port)
{
var timeDelta = DateTime.UtcNow - StartDate;
Console.WriteLine(string.Format("Serwer na porcie {0} włączony w wczasie {1}", port, timeDelta));
ServerCouneter--;
}
}
internal class Server
{
public int Port { get; set; }
public Server(int port)
{
Port = 10000 + port;
}
private System.Net.Sockets.TcpListener Listener;
public void Start()
{
try
{
Listener = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, Port);
Listener.Start();
Program.StartServer(Port);
while (true)
{
Listener.AcceptTcpClient();
}
}
catch {
///obsługa błedu WSACancelBlockingCall
}
}
public void Stop()
{
Listener.Stop();
Listener = null;
}
}
}
Na początku jest tworzona instancja 20 serwerów na porcie od numeru 10000 i zwiększane co jeden Następnie, za taska i pętli są uruchamiane wszystkie serwery - kiedy zostaną uruchomione, następuje ich wyłącznie. Efektem tego są takie wpisy w konsoli:
I właśnie... czy da się jakoś to przyspieszyć? Tworzenie serwera przy użyciu soketa i bind'a daje ten sam rezultat. Uruchomienie jako admin też nie pomogło. Całość jest napisane jest w Net 5.0. Jeśli ktoś ma pomysł jak to zrobić to będę bardzo wdzięczny :)
- screenshot-20201013203325.png (45 KB) - ściągnięć: 3
mad_penguin