私は単純な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 ++の実装ですか?多分それは実際にはクライアント側の問題ですか?
コメントは大歓迎です!
ofer