Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 |

 

  Вопрос: Дисконнект сокетов в .Net Добавлено: 21.04.06 00:31  

Автор вопроса:  Neco | Web-сайт: neco.pisem.net | ICQ: 247906854 
Как узнать когда удалённый сокет разорвал соединение?

Ответить

  Ответы Всего ответов: 38  

Номер ответа: 1
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #1 Добавлено: 21.04.06 00:58
Public ReadOnly Property Connected() As Boolean
     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-сайт: neco.pisem.net
 Профиль | | #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-сайт: softvito.narod2.ru
 Профиль | | #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-сайт: neco.pisem.net
 Профиль | | #6
Добавлено: 21.04.06 11:17
http://bbs.vbstreets.ru/viewtopic.php?t=11670

Короче, это характеризуется коротким русским словом - на "ж" начинается, на "опа" оканчивается.

Сокетами явно занимался блатной племянник Билли.

Ответить

Номер ответа: 7
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #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-сайт: softvito.narod2.ru
 Профиль | | #9
Добавлено: 21.04.06 15:55
EROS

тут стоит вопрос КАК, а не ПОЧЕМУ.


Ян.
- Никогда мне этого до конца не понять...
Локи.
- Понимать и не нужно, главное уметь пользоваться...

"Замок на стыке миров"
:)))


Ты же сам ответил на свой вопрос.

Либо отлавливать .. SocketException


Так это кажется и MS рекомедует делать.

Ответить

Номер ответа: 10
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #10 Добавлено: 21.04.06 16:35
Раскажи, хоть в общих словах, где чудовищное заблуждение?
А я приведу аргументы. почему я пришел к такому мнению (если конечно мне не станет жутко стыдно:)).

Ммммм....
Сборщик мусора уничтожает те и только те объекты (освобождает ресурсы etc), на которые не ссылается ни одна действующая переменная в приложении. Таким образом, сборщик мусора никогда не уберёт ни сокет, ни соединение к базе, до тех пор, пока явным образом не будут освобождены все переменные, ссылающиеся на этот объект. Уничтожение произойдёт не сразу после этого, но не раньше, чем это произойдёт.

Таким образом, представляется вероятным, что если у тебя сборщик мусора (кстати, ты уверен, что это он?) убирает соединение к базе, значит он это делает потому, что ты сам это соединение объявил так, что оно вышло из области видимости.
То же с сокетами. Сборщик мусора не имеет никакого отношения к внутренней структуре сокета и не знает о ней. Он просто вызовет деструктор сокета и всё. Но деструктор не будет вызван, пока существует хоть одна ссылка на сокет.

При этом всём, да, отлавливание дисконнекта приходится делать самому (см. ссылку). Но оно не имеет отношения к сборщику мусора. С точки зрения мусора, закрытый сокет столь же валиден, сколь и открытый.

Ответить

Номер ответа: 11
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #11
Добавлено: 21.04.06 19:11
Я некорректно выразился, не сборщик мусора, а модель управления ресурсами.

Сборщик мусора уничтожает те и только те объекты (освобождает ресурсы etc), на которые не ссылается ни одна действующая переменная в приложении. Таким образом, сборщик мусора никогда не уберёт ни сокет, ни соединение к базе, до тех пор, пока явным образом не будут освобождены все переменные, ссылающиеся на этот объект. Уничтожение произойдёт не сразу после этого, но не раньше, чем это произойдёт.


Истинна. Главное здесь, что момент уничтожения не предсказуем, даже после освобождения всех ссылок на объект.

И как же в таком случае реализовать модель работы с деффицитными ресурсами?

Допустим соединение с базой данных. Объект должен освобождать ресурс, как только он не используется, что и реализовано.
То же самое сокеты, если нет обмена данными, ресурс освобождается.

С точки зрения мусора, закрытый сокет столь же валиден, сколь и открытый.

Вот именно, поэтому и приходится отлавливать их самому.
Т.е. модель упраления ресурсами, и сбор мусора имеют и свои неудобства.

Если что - то опять не так исправь...

Ответить

Номер ответа: 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
http://bbs.vbstreets.ru/viewtopic.php?t=11670

Повторяя слова автора топика.. Ощущение грязно выполненной работы. На самом деле.. как то кривовато.. должно быть более простое и красивое решение..(имхо)
(задумчиво) хмм... осталось лишь его найти..

Ответить

Номер ответа: 15
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #15
Добавлено: 21.04.06 19:47
GSerg
Отнюдь. Нет обмена данными, ресурс висит. И будет висеть вечно, пока не исчезнет последняя переменная, хранящая ссылку на него.


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

Посему для упрощения (или за невозможностью сделать иначе) объект сам освобождает занятый им ресурс, не будучи уничтоженным.
Вот что я имею в виду.

EROS

Мудрые слова.. и в большинстве случаев они справедливы..


Мне тоже нравятся:))

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам