C# tcplistener перестает прослушивать после фазы ожидания

Я пытаюсь понять, почему мои клиенты иногда не могут подключиться к серверу после того, как прослушиватель работал некоторое время, и ни один клиент не пытался подключиться. Единственный способ исправить это - перезапустить прослушиватель TCP - сервер. Нет проблем, если я запускаю сервер, и некоторые люди подключаются, делают что-то и отключаются позже.

У меня есть простой цикл while для приема входящих соединений сокетов:

            while (IsOn)
            {
                try
                {
                    if (!tcpListener.Pending())
                    {
                        Thread.Sleep(100);
                        continue;
                    }
                    Socket socket = tcpListener.AcceptSocket();
                    if (socket != null)
                    {
                        TcpClient client = new TcpClient();
                        client.Client = socket;
                        IncommingClientConnection(client); // Nonblocking Code
                    }
                }catch(Exception e)
                {
                    NetLog.Exception(e, "An error occured while user connected!");
                }
            }

В последний раз ошибка произошла примерно через 8 часов простоя. Иногда бывает раньше.

Я попытался отладить эту проблему, но поток слушателя все еще работал и кажется, что он зависает.

tcpListener.AcceptSocket()

.

Я читал, что это можно исправить, настроив службу Windows, но на данный момент это потребует много работы. Но разве нет другого способа заставить Слушателя оставаться открытым?

Любое предложение высоко ценится, спасибо!

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

Marc Gravell 10.08.2018 16:09

Правильно ли вы удалили своего клиента в IncommingClientConnection (client) после его использования?

Sergey L 10.08.2018 16:31

Возможно ли, что входящие запросы обрабатываются в том же потоке, в котором они принимаются? Тогда новый запрос не будет принят до тех пор, пока не будет обработан предыдущий. Если есть какие-либо проблемы с обработкой запроса, у некоторых клиентов могут возникнуть проблемы при попытке подключения. Обработка запроса AFAIU обычно делегируется другому потоку, чтобы убедиться, что любое (разумное) количество клиентов может подключиться. Примечание: пробовали ли вы поставить точку останова после строки AcceptSocket()? Эта команда - это то место, где ваш код ожидает входящих запросов, поэтому кажется, что он зависает.

Korli 10.08.2018 17:07

FWIW, я думаю, что этот код будет эффективнее без проверки Pending и сна.

500 - Internal Server Error 10.08.2018 17:23

@ 500 - Internal Server Error Спасибо за эту подсказку. Меня не волнует сон 100 мс, потому что входящие клиенты будут складываться и обрабатываться сразу. После подключения 1 (из 10) клиентов функция Pending () вернет false.

bitQUAKE 12.08.2018 16:10
0
5
391
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я разобрался, в чем была ошибка. Это так нелепо, потому что почему замороженный поток должен иметь какое-то отношение к «Console.WriteLine ()» ?!

Проблема заключалась в том, что окно консоли в Windows Server 2016 каким-то образом переходит в режим ввода. Затем поток блокируется на «Console.WriteLine» и ждет, пока пользователь нажмет Enter в окне консоли ?! Я пробовал несколько сценариев. Даже если я какое-то время не касался Remove-Desktop, эта проблема возникала.

Решение: переключитесь с консольного приложения на приложение Windows и отслеживайте вывод во встроенном Console-View вашей IDE.

Я надеюсь, что это помогает кому-то...

Другие вопросы по теме