Страница: 1 | 2 | 3 |
Вопрос: Дисконнект сокетов в .Net
Добавлено: 21.04.06 00:31
Автор вопроса: Neco | Web-сайт:
Как узнать когда удалённый сокет разорвал соединение?
Ответы
Всего ответов: 38
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 21.04.06 00:58
Member of: System.Net.Sockets.Socket
Summary:
Gets a value that indicates whether a System.Net.Sockets.Socket is connected to a remote host as of the last Overload:System.Net.Sockets.Socket.Send or Overload:System.Net.Sockets.Socket.Receive operation.
Return Values:
true if the System.Net.Sockets.Socket was connected to a remote resource as of the most recent operation; otherwise, false.
Либо отлавливать .. SocketException
Номер ответа: 2
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #2
Добавлено: 21.04.06 01:25
Connectted, кстати, ни фига не пашет пока ничего не делаешь, поэтому надо, видимо, постоянно обмениваться контрольными пакетами НА УРОВНЕ ПРИЛОЖЕНИЯ! Дурдом!
P.S. Мне хотелось бы именно событие получить - т.е. известить юзера до того, как он решил отослать мессагу опоненту, которую печатать минут пять. К примеру...
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 21.04.06 02:47
А если попробовать такой вариант:
Из Socket получить NetworkStream и где нибудь в потоке через Thread.Sleep проверять NetworkStream.CanRead или NetworkStream.CanWrite.. Как только получишь False, считай пипец.. приплыли.. и, разумеется генерировать событие Disconnect
Номер ответа: 4
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #4
Добавлено: 21.04.06 02:52
Ничего, не переживай, там еще хуже фичи есть...
Оюмениваться постоянно не надо, отоши контроьный пакет перед отправкой сообщения.
Это издержки сборки мусора - мы не знаем когда освободиться ресурс, поэтому спроектировано именно так. Connectted прекращает работу, когда не активно, а управлять этим мы не можеем.
То же самое в ADO.NET - соедение постоянно прерывается и издержки очень значительны.
З.Ы. Проблема освобождения ресурсов, есть одна из главных проблем НЕТ и на данном этапе ее решили именно так.
Ну а как по другому, если к примеру мы работаем с БД и понятия не имеем, когда НЕТ освободит ресурс?
Ничего у MS все начинает получаться к третьей версии
Номер ответа: 5
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #5
Добавлено: 21.04.06 04:47
Принципиально неверное утверждение. Сборщик мусора здесь вообще никаким боком.
Ну а как по другому, если к примеру мы работаем с БД и понятия не имеем, когда НЕТ освободит ресурс?
Чудовищно неверное утверждение, свидетельствующее о полном непонимании автором сути происходящего.
По теме:
http://bbs.vbstreets.ru/viewtopic.php?t=11670
Номер ответа: 6
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #6
Добавлено: 21.04.06 11:17
Короче, это характеризуется коротким русским словом - на "ж" начинается, на "опа" оканчивается.
Сокетами явно занимался блатной племянник Билли.
Номер ответа: 7
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #7
Добавлено: 21.04.06 14:41
GSerg
Вот это уже интересный разговор
Собственно это лишь моя попытка, ответить на вопрос ПОЧЕМУ?
А почемучка я еще тот
Почему ветер дует? Потому что деревья качаются?
О.Генри "Вождь краснокожих"
Раскажи, хоть в общих словах, где чудовищное заблуждение?
А я приведу аргументы. почему я пришел к такому мнению (если конечно мне не станет жутко стыдно).
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 21.04.06 15:08
GSerg,vito
Парни.. хорош бодаться.. тут стоит вопрос КАК, а не ПОЧЕМУ. На самом деле вопрос остался нерешенным, и рано или поздно мы все с этим столкнемся. Меня вот тоже задела проблема.. Все же как можно однозначно отловить дисконнект удаленного хоста? 2 часа ночных экспериментов-результатов не дали.. (((
Номер ответа: 9
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #9
Добавлено: 21.04.06 15:55
EROS
Ян.
- Никогда мне этого до конца не понять...
Локи.
- Понимать и не нужно, главное уметь пользоваться...
"Замок на стыке миров"
))
Ты же сам ответил на свой вопрос.
Так это кажется и MS рекомедует делать.
Номер ответа: 10
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #10
Добавлено: 21.04.06 16:35
А я приведу аргументы. почему я пришел к такому мнению (если конечно мне не станет жутко стыдно).
Ммммм....
Сборщик мусора уничтожает те и только те объекты (освобождает ресурсы etc), на которые не ссылается ни одна действующая переменная в приложении. Таким образом, сборщик мусора никогда не уберёт ни сокет, ни соединение к базе, до тех пор, пока явным образом не будут освобождены все переменные, ссылающиеся на этот объект. Уничтожение произойдёт не сразу после этого, но не раньше, чем это произойдёт.
Таким образом, представляется вероятным, что если у тебя сборщик мусора (кстати, ты уверен, что это он?) убирает соединение к базе, значит он это делает потому, что ты сам это соединение объявил так, что оно вышло из области видимости.
То же с сокетами. Сборщик мусора не имеет никакого отношения к внутренней структуре сокета и не знает о ней. Он просто вызовет деструктор сокета и всё. Но деструктор не будет вызван, пока существует хоть одна ссылка на сокет.
При этом всём, да, отлавливание дисконнекта приходится делать самому (см. ссылку). Но оно не имеет отношения к сборщику мусора. С точки зрения мусора, закрытый сокет столь же валиден, сколь и открытый.
Номер ответа: 11
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #11
Добавлено: 21.04.06 19:11
Я некорректно выразился, не сборщик мусора, а модель управления ресурсами.
Истинна. Главное здесь, что момент уничтожения не предсказуем, даже после освобождения всех ссылок на объект.
И как же в таком случае реализовать модель работы с деффицитными ресурсами?
Допустим соединение с базой данных. Объект должен освобождать ресурс, как только он не используется, что и реализовано.
То же самое сокеты, если нет обмена данными, ресурс освобождается.
Вот именно, поэтому и приходится отлавливать их самому.
Т.е. модель упраления ресурсами, и сбор мусора имеют и свои неудобства.
Если что - то опять не так исправь...
Номер ответа: 12
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #12
Добавлено: 21.04.06 19:28
И как же в таком случае реализовать модель работы с деффицитными ресурсами?
Дык это, RTFM, типа того. Да.
IDisposable.
Object.Dispose.
Отнюдь. Нет обмена данными, ресурс висит. И будет висеть вечно, пока не исчезнет последняя переменная, хранящая ссылку на него.
Вовсе не "вот именно". События сокета никак не связаны с освобождением ресурсов.
Номер ответа: 13
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #13
Добавлено: 21.04.06 19:29
- Никогда мне этого до конца не понять...
Локи.
- Понимать и не нужно, главное уметь пользоваться...
Мудрые слова.. и в большинстве случаев они справедливы.. Но одно из Private Property ума-пытливость.. И вот тут начинаешь задаваться разными вопросами и искать на них ответы...
Номер ответа: 14
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #14
Добавлено: 21.04.06 19:35
Повторяя слова автора топика.. Ощущение грязно выполненной работы. На самом деле.. как то кривовато.. должно быть более простое и красивое решение..(имхо)
(задумчиво) хмм... осталось лишь его найти..
Номер ответа: 15
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #15
Добавлено: 21.04.06 19:47
GSerg
Да я не про тот ресурс, который память занимает, а тот который осуществляет к примеру загрузку канала. Висит, пусть висит. Явно мы его уничтожить не можем, но если он к тому же удаленный сокет загрузит, это не есть хорошо.
Посему для упрощения (или за невозможностью сделать иначе) объект сам освобождает занятый им ресурс, не будучи уничтоженным.
Вот что я имею в виду.
EROS
Мне тоже нравятся)