C # Tcp Listener для приема нескольких соединений, но не получить флуд? - PullRequest
0 голосов
/ 20 августа 2010

Я создаю свое первое приложение на маленьком сервере.Я просто хотел узнать, как лучше принять несколько соединений, но не залить, скажем, 10 соединений за 10 секунд, а затем, если залить, закрыть слушателя.Помогут ли мне в этом потоки или пул потоков.

Я добавил пул потоков, но не уверен, как его использовать для своего приложения.

Пожалуйста, посмотрите на мой код ниже и посмотритечто мне нужно сделать, чтобы сделать его безопасным и не получить затопления.

Спасибо

class Listener
    {
        public static TcpListener _listener;
        private static TcpClient _client;
        private static NetworkStream _clientStream;

        public Listener(string ip, Int32 port)
        {
            ThreadPool.SetMaxThreads(50, 100);
            ThreadPool.SetMinThreads(50, 50);


            // Set the TcpListener IP & Port.

            IPAddress localAddr = IPAddress.Parse(ip);
            _listener = new TcpListener(localAddr, port);
        }

        public void Start()          // Run this on a separate thread, as
        {                            // we did before.
            _listener.Start();

            Console.WriteLine("Starting server...\n");
            Console.WriteLine("Listening on {0}:{1}...", Globals._localIP, Globals._port);

            while (Globals._Listen)
            {
                try
                {

                    if (!_listener.Pending())
                    {
                        Thread.Sleep(500); // choose a number (in milliseconds) that makes sense
                        continue; // skip to next iteration of loop
                    }

                    Globals._requestCounter += +1;
                    // Get client's request and process it for web request.
                    ProcessRequest();

                }
                catch (SocketException e)
                {
                    // Listener Error.

                }  

                catch (InvalidOperationException er)
                {


                }
            }

            _listener.Stop();

        }

        public static void Stop()
        {
            Globals._Listen = false;

        }
}

    static void Main(string[] args)
    {

        // Set listener settings.
        var server = new Listener(Globals._localIP, Globals._port);

        // Start the listener on a parallel thread:
        Thread listenerThread = new Thread(server.Start);
        listenerThread.Start();

        Thread.Sleep(500);
}

1 Ответ

1 голос
/ 20 августа 2010

Для TCP в .NET я настоятельно рекомендую использовать WCF, а не пытаться свернуть свой собственный.Для ваших нужд существует «служба общего доступа к TCP-портам», вам просто нужно ее включить.Кроме того, такие вещи, как регулирование, ограничения размера сообщений, уже решены, вам просто нужно настроить его.Существует также множество способов использования WCF net.tcp, он может выполнять потоковую передачу, одноранговую связь, полный дуплекс и т. Д., Поэтому существует очень мало сценариев, в которых вам нужно выполнить свою собственную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...