#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();
}