Обрабатывать утечку, когда сокет принудительно закрывается удаленным хостом? (.сеть) - PullRequest
0 голосов
/ 18 февраля 2010

Я создал простой «протокол эха» на основе tcp и заметил, что у меня возникает утечка дескриптора на сервере, когда клиент принудительно закрывает соединение (отправляет сброс).

Я перехватываю ConnectionReset и располагаю сокет точно так же, как и при закрытом сокете (socket.Shutdown и socket.close). Как кто-нибудь сталкивался с такой проблемой? Исключение ConnectionReset выдается, пока я выполняю сокет. Если это имеет значение, прочитайте.

Спасибо.

Редактировать: инструмент Microsoft DebugDiag предполагает, что это обработчики событий, созданные MSCORLIB. Само собой разумеется, что я не создаю их напрямую (но они создаются где-то библиотекой .net)

Ответы [ 2 ]

1 голос
/ 18 февраля 2010

Socket.Recieve и Socket.Write, к сожалению, являются единственными местами, где можно обнаружить, когда другой конец закрывает свои гнезда принудительно, а не правильно.

Socket.Close() должен (в соответствии с моим разумом) освободить дескриптор сокета.

Итак, сначала убедитесь, что Socket.Close() действительно вызывается. Затем проверьте другие места на наличие утечек на ручке. Используете ли вы какие-либо предметы, которые требуют утилизации, которые не утилизируются? Например, открытие FileStream s?

0 голосов
/ 18 февраля 2010

Я думаю, что вы все делаете правильно:

Socket.Close должно освободить все управляемые и неуправляемые ресурсы, связанные с сокетом.

Но вы также пытались установить

socket = null;

А может (после этого) использовать

GC.Collect();

, чтобы вручную запустить сборщик мусора, утечка все еще присутствует после этого?

Другая идея: Как вы отслеживаете утечку ручки?ОС может хранить закрытое TCP-соединение в памяти в течение длительного времени (минут), это нормальное поведение.

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