Проблемы с TcpClient
От: Аноним  
Дата: 22.09.10 10:33
Оценка:
Добрый день, дорогие разработчики.
У меня возникли некоторые проблемы с .Net framework 2, а именно с его классом TcpClient:
При использовании этого класса число дескрипторов(хэндлов, Handles) которыми пользуется процесс растет, но при уничтожении этого класса дескрипторы не освобождаются(не возвращаются виндовсу).
Это можно наблюдать в TaskMeneger'e;

Минимальный код демонстрирующий проблему:
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(new IPEndPoint(ipLocalServer, portLocalServer));
sock.Listen(1);

DebugInfo.Info.WriteLine("Create server on {0}:{1}\n", ipLocalServer, portLocalServer);

EventArgsBoolOk argConnection = new EventArgsBoolOk();
while (true)
{
using (Socket sockClient = sock.Accept())
{
using (TcpClient client = new TcpClient())
{
client.Client = sockClient;
}
}
}


Необходимо запустить приложение, запустить TaskMeneger со вкладкой процессов и отоброжением кол-ва дескприторов. После этого несколько раз соединитесь с этим сервером telnet'ом. И посмотрите как стремительно растет число.

Тестируемые ОС windows XP SP 3, Windows server 2003 SR2


Из-за такой ошибки мой продукт у клиента на сервере довел скорость работы windows программ до очень низкого уровня. Поэтому мысли, что дескрипторы вернутся со временем не верны, никакой сборщик мусора их не вернет.

Скажите, нигде ли я не туплю? Как решить проблему?

С уважением, Илья.
Re: Проблемы с TcpClient
От: DuШes  
Дата: 22.09.10 10:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день, дорогие разработчики.

А>У меня возникли некоторые проблемы с .Net framework 2, а именно с его классом TcpClient:
А>При использовании этого класса число дескрипторов(хэндлов, Handles) которыми пользуется процесс растет, но при уничтожении этого класса дескрипторы не освобождаются(не возвращаются виндовсу).
А>Это можно наблюдать в TaskMeneger'e;

[...]

может потому что ShutDown для сокета client явно не вызываешь? хотя он должен вызываться в момент освобождения ресурса в реализации IDisposable, но все таки можно попробовать вызывать явно
Посмотри также на значение CloseTimeout...
socket
Re[2]: Проблемы с TcpClient
От: Аноним  
Дата: 22.09.10 11:20
Оценка:
DШ>может потому что ShutDown для сокета client явно не вызываешь? хотя он должен вызываться в момент освобождения ресурса в реализации IDisposable, но все таки можно попробовать вызывать явно
DШ>Посмотри также на значение CloseTimeout...
ShutDown не помогает.
CloseTimeout попробую сейчас...
Re[2]: Проблемы с TcpClient
От: Аноним  
Дата: 22.09.10 11:28
Оценка:
DШ>Посмотри также на значение CloseTimeout...
Не нашел такого свойства, где искать нужно?
Re[3]: Проблемы с TcpClient
От: DuШes  
Дата: 22.09.10 12:24
Оценка:
Здравствуйте, Аноним, Вы писали:


DШ>>может потому что ShutDown для сокета client явно не вызываешь? хотя он должен вызываться в момент освобождения ресурса в реализации IDisposable, но все таки можно попробовать вызывать явно

DШ>>Посмотри также на значение CloseTimeout...
А>ShutDown не помогает.
А>CloseTimeout попробую сейчас...

приведи полный код, возникло стойкое ощущение что до вызова dispose у тебя дело не доходит и переменная client продолжает жить своей жизнью...
вынеси client до while и проведи эксперимент так сказать в лоб:
sock = new Socket(....);
sock.Bind;
while(...)
{
client = sock.Accept()
client = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}

ps:
сам процесс создания tcpclient кажется в приведенном тобой примере выглядит кривым, используй уж тогда TcpListener и его методы вместо переназначения полученного клиентского сокета объекту класса TcpClient
Re[4]: Проблемы с TcpClient
От: Аноним  
Дата: 23.09.10 04:48
Оценка:
Да, проблема действительно в способе создания TcpClient'a, хотя судя по MSDN он разрешен... Ладно, буду помнить.
Спасибо за помощь!
Re[5]: Проблемы с TcpClient
От: Nikolay_P_I  
Дата: 23.09.10 04:53
Оценка:
А>Да, проблема действительно в способе создания TcpClient'a, хотя судя по MSDN он разрешен... Ладно, буду помнить.

А можно на пальцах — что там неправильно ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.