Сокеты и ошибки тайм-аута - PullRequest
0 голосов
/ 03 января 2011

Я создаю программу, которая имеет очень простую предпосылку.

Для X количество объектов Открытое соединение Выполнить действия Закрыть соединение Открыть Далее

Каждое из этих соединений выполняется на прокси-сервере socks5, и после примерно 200-го соединения я получаю сообщение об ошибке «Операция имеет тайм-аут». Я проверил все прокси, и они работают просто отлично, и действительно странно, если я закрою программу и перезапущу ее снова, проблемы исчезнут. Поэтому мне остается верить, что когда я закрываю соединение, оно действительно не закрывает соединение и компьютер перегружается. Как я могу принудительно закрыть все соединения носков, которые связаны с классом?

            socket.Shutdown(SocketShutdown.Both);
            //socket.Close();

            socket.Disconnect(true);
            socket = null;

В ответ на подсказку по использованию netstat я проверил это. Я заметил связи, где задержался, но в конце концов ушел. Тем не менее, проблема все еще остается, после примерно 100-го соединения, 5-секундная пауза между соединениями. Я получаю ошибки тайм-аута. Если я закрою программу и перезапущу ее, они исчезнут. По какой-то причине я чувствую, что связи оставляют позади что-то. Netstat покажет это. Я даже пытался добавить экземпляры клиента в список, и каждый раз, когда каждый заканчивает работу, удаляйте его из списка и затем устанавливайте в ноль. Есть ли способ убить порт? Может быть, это сработает, если я убью порт, на котором было установлено соединение? Возможно ли, что это проблема ОС Windows? Что-то, что использовалось для предотвращения вирусов? Я создаю примерно одно соединение в минуту и ​​поддерживаю это соединение примерно в течение 1 минуты, прежде чем перейти к следующему с как минимум 20 одновременными, если не больше, соединениями одновременно. Что имеет смысл для меня, так это то, что закрытие программы, кажется, очищает все ресурсы, которые я не очищаю в своем коде. Я использую класс, который я нашел в интернете, который позволяет использовать прокси socks5 с классом сокета. Так что я действительно в растерянности, какой-нибудь совет или направление в голову было бы здорово? Это должно быть красиво. У меня возникло искушение увидеть текстовый файл, в котором я был в моем списке подключений, и завершил работу программы, а затем программа anohter перезапустила его, чтобы узнать, где он остановился в данный момент.

Ответы [ 2 ]

1 голос
/ 03 января 2011

Звучит так, будто ваши связи на самом деле не закрыты. Не видя код, трудно устранить это; Вы можете свести его к программе, которая проходит через последовательность открытия-закрытия?

Если соединение не закрывается должным образом, вы, вероятно, можете увидеть, в каком состоянии оно находится с помощью netstat. У вас есть 200 установленных соединений, или они находятся в каком-то состоянии закрытия?

0 голосов
/ 03 января 2011

Сокеты реализуют IDisposable.Только вызов Dispose или Close заставит сокет отказаться от неуправляемых ресурсов детерминированным способом.Это приводит к тому, что вы исчерпываете ресурсы, которые использует сокет (возможно, какой-то сетевой дескриптор), даже если вы не можете использовать какой-либо управляемый объект.

Так что вам, вероятно, следует просто сделать

 socket.Shutdown(SocketShutdown.Both);
 socket.Close();

Для ясности установка сокета на Null не делает этого, потому что установка сокета на null приводит к тому, что сокеты помещаются только в свободную очередь, и вызывается финализатор, когда он приступает к обработке свободной очереди.,

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

Обновление Я проверил иСокеты действительно содержат дескриптор WSASocket .Поэтому, если вы не вызовете close или не утилизируете, вам придется ждать, пока Finalizer не запустится (или не выйдет из приложения), чтобы вы вернули их обратно.

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