Нужна помощь в тестировании TCP-сервера

#c# #tcp #connection #client #stress-testing

#c# #tcp #подключение #клиент #стресс-тестирование

Вопрос:

Недавно я создал сервер для одного из своих проектов. Сервер работает с TCP-соединением. (5 устройств подключаются к нему одновременно). Для каждого устройства, которое подключается к нему, я затем создаю новую строку сетки с полученной информацией. Моя проблема в том, что если у меня есть клиенты, включенные до запуска сервера, сервер не может обрабатывать поток входящих подключений и выходит из строя. Мне нужно запустить его несколько раз, прежде чем он, наконец, запустится.

К сожалению, я не могу воспроизвести ошибку у себя дома, чтобы отладить ее. Есть ли какое-либо приложение, которое могло бы всегда пытаться подключиться к серверу и, когда оно, наконец, завершится успешно, отправить ему строку по сети?

Комментарии:

1. Возможно. Или вы могли бы написать один

Ответ №1:

В конце концов, я написал свое приложение для этой цели. Приложение очень примитивное. Он просто пытается восстановить соединение все время, пока он не подключен к серверу, и когда это удается, он отправляет строку подключения на сервер и считывает ответ.

Вот код, если кто-то хотел бы его использовать: (для большего количества подключений сразу просто запустите больше экземпляров этого приложения или измените код соответствующим образом)

https://pa ste bin(.)com / g0wcJXh7 (прошу прощения, но я просто не смог вставить весь код внутрь кодового блока — он всегда помещал туда только его часть)

 static TcpClient client;
    static string ipAdress = "10.10.2.29";
    static int port = 11800;
    static string cnnMess;
    static string junkMess;
    static Byte[] bytes;
    static Byte[] bytes_junk;
    static void Main(string[] args)
    {
        //initializing variables
        Random r = new Random();
        cnnMess = string.Format("CNN?AA:BB:CC:DD:{0}!", r.Next(10, 99));
        bytes = Encoding.UTF8.GetBytes(cnnMess);
        junkMess = "JUNK!";
        bytes_junk = Encoding.UTF8.GetBytes(junkMess);


        while (true)
        {
            try
            {
                client.GetStream().Write(bytes_junk, 0, bytes_junk.Length); //App tries to send junk packet to the server (used to determine wether the connection still exist)
                Thread.Sleep(50); //Put the thread to sleep to minimize the trafic
            }
            catch //if the sending fails it means that the client is no longer connected --> reconnect
            {
                Connect();
            }
        }
        
        
    }
    static void Connect()
    {
        client = new TcpClient();
        try
        {
            client.Connect(ipAdress, port);
        }
        catch { }
        int count = 0;
        while (!client.Connected)
        {
            Thread.Sleep(500);
            count  ;
            if(count >= 5)
            {
                try
                {
                    client.Connect(ipAdress, port);
                }
                catch { }
                count = 0;
                Console.WriteLine("Connection Failed - retrying");
            }
        }
        var writer = new StreamWriter(client.GetStream());
        var reader = new StreamReader(client.GetStream());
        client.GetStream().Write(bytes, 0, bytes.Length);


        Console.WriteLine(cnnMess);
        while (client.GetStream().DataAvailable)
        {
            Console.Write(client.GetStream().ReadByte());
        }
        Console.WriteLine();

        }