![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить, что соединение разорвано?
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]
> Можно как-нибудь обойтись без отправки и ускорить процесс?
Вот объясните мне, зачем надо обязательно знать, что соединение потеряно, если все равно ничего не передается?