• Как исправить ошибку ложного подключения на стороне TcpClient?

    AshBlade
    @AshBlade Куратор тега C#
    Просто хочу быть счастливым
    Для взаимодействия ты используешь TCP.
    Connect() возвращается, когда установлено соединение, но само соединение все еще может находиться в очереди - то, что здесь и происходит.
    Поэтому, лучше такое решение:

    const int maxPartySize = 2;
    var party = new List<TcpClient>();
    var locker = new object();
    
    var ip = IPAddress.Loopback;
    var port = 50000;
    var server = new TcpListener(ip, port);
    
    server.Start(128);
    Console.WriteLine("Сервер запущен..");
    
    while (true)
    {
        var client = await server.AcceptTcpClientAsync();
        _ = ProcessClientAsync(client);
        Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} подключен. Текущий размер группы: {party.Count}");
    }
    
    async Task ProcessClientAsync(TcpClient client)
    {
        await Task.Yield();
        bool added;
        lock (locker)
        {
            if (added = party.Count < maxPartySize)
            {
                party.Add(client);
            }
        }
    
        if (added)
        {
            Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} добавлен в группу");
        }
        else
        {
            Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} НЕ добавлен в группу");
        }
        
        client.Close();
    }


    P.S. когда принимаешь клиента не нужно писать using TcpClient client = ... иначе клиент закроется до начала его обработки
    Ответ написан
    Комментировать
  • Как исправить ошибку ложного подключения на стороне TcpClient?

    NikFaraday
    @NikFaraday
    Student full-stack Developer
    Попробуйте использовать более системный подход ограничения доступа через использования семафоров (SemaphoreSlim)

    Второй момент, это подключение. То, что соединения установлено говорит лишь о том, что соединение с сервером ЕСТЬ, но это не значит, что в клиента есть доступ к ресурсам сервера. Для этого вы можете создать свои правила. Вы можете сообщить клиенту, что он находится в очереди и перед ним находится n клиентов.
    Ответ написан
    Комментировать