Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить, что соединение разорвано?


Nucer ©   (2007-05-21 19:00:00) 

Использую TClientSocket. Если грубо говоря выдернуть кабель из сетевой карты, то событие OnDisconnect/OnError не произойдет, пока не будет принята попытка отправить какой-нибудь данные... и то в этом случае задержка между вызовом send и событием может составить около 10ти секунд.

Можно как-нибудь обойтись без отправки и ускорить процесс?


Сергей М.   (2007-05-23 13:44:00) [1]


> Nucer   (22.05.07 15:29) [11]
>
> А что-нибудь типа KeepAlive запроса =)


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


SpellCaster   (2007-05-23 13:17:00) [2]

> [11] Nucer   (22.05.07 15:29)
Это то же самое, что в [8]


Сергей М.   (2007-05-22 15:33:00) [3]


> наверняка есть другой выход


Других выходов нет и не будет.


> Делал так:
> recv(

С какого перепугу ты взялся за WinsockAPI ?
И если взялся, то где анализ результата. возвращаемого этой функцией?


> И так:
> cs.Socket.Read


> Никакой реакции


Какую реакцию ты ожидал ?
Ты справку к методу TCustomWinSocket.Read читал, прежде чем ожидать какую-то конкретную реакцию ?


Nucer   (2007-05-22 15:29:00) [4]

А что-нибудь типа KeepAlive запроса =)


DVM   (2007-05-22 15:25:00) [5]


> Не хотелось бы слать мусор каждые 5 секунд... пусть и один
> байт... наверняка есть другой выход.

нету.


Nucer   (2007-05-22 15:08:00) [6]


> Заведи таймер, в его обработчике делай тоже самое что и
> в обработчике OnRead. Успешный вызов read-метода означает,
>  что соединение "живое", неуспешный - "мертвое".

Делал так:
recv(cs.Socket.SocketHandle,pbuf,1,MSG_PEEK);
И так:
cs.Socket.Read(cs.Socket.SocketHandle);
И вот так:
cs.Socket.SendText('');

Никакой реакции. Достаточно отправить хотя бы один байт - cs.Socket.SendText('X') - получаю OnDisconnect.


> "Пингуй" сервак тестовыми пакетами каждые 5 сек, например

Не хотелось бы слать мусор каждые 5 секунд... пусть и один байт... наверняка есть другой выход.


SpellCaster   (2007-05-22 14:46:00) [7]

"Пингуй" сервак тестовыми пакетами каждые 5 сек, например


Сергей М.   (2007-05-22 09:38:00) [8]


> что делать, если мне не надо ничего передавать, а только
> принимать?


Заведи таймер, в его обработчике делай тоже самое что и в обработчике OnRead. Успешный вызов read-метода означает, что соединение "живое", неуспешный - "мертвое".


Nucer   (2007-05-22 09:29:00) [9]

Нет, в данной ситуации я имел ввиду, что без вызова send события OnDisconnect можно ждать очень долго. А что делать, если мне не надо ничего передавать, а только принимать?


Сергей М.   (2007-05-22 09:16:00) [10]


> Nucer   (22.05.07 09:08) [4]


Т.е. ты утверждаешь, что в данной конкретнойситуации событие OnDisconnect возникнет намного позже успешного(??) вызова Send-метода, так ?

Не верю.


Nucer   (2007-05-22 09:08:00) [11]

>Рассказывай подробно про эти "определенные случаи"...
К примеру, если я перезагружу свой роутер... в таком случае программа вообще не определит, что соединение разорвано пока не будет принята попытка передать данные.


Сергей М.   (2007-05-22 08:14:00) [12]


> в определенных случаях событие Disconnect возникает с очень
> большой задержкой


Рассказывай подробно про эти "определенные случаи" ..


Nucer   (2007-05-21 21:27:00) [13]

Для того, чтобы восстановить соединение.
---
Клиент соединяется с сервером, редко шлет какую-либо информацию, в основном получает ее. Но, сервер может и не слать ничего на протяжении пят минут, а потом отправить один пакет. Так вот если соединение разорвано, то клиент быстро соединяется заново. Но проблема в том, что в определенных случаях событие Disconnect возникает с очень большой задержкой.


DVM   (2007-05-21 21:20:00) [14]


> Можно как-нибудь обойтись без отправки и ускорить процесс?

Вот объясните мне, зачем надо обязательно знать, что соединение потеряно, если все равно ничего не передается?


Наверх

Титульная страница Поиск, карта сайта Написать письмо