Текущий архив: 2008.02.03;
Скачать: CL | DM;
ВнизКак определить, что соединение разорвано? Найти похожие ветки
← →
Nucer (2007-05-21 19:00) [0]Использую TClientSocket. Если грубо говоря выдернуть кабель из сетевой карты, то событие OnDisconnect/OnError не произойдет, пока не будет принята попытка отправить какой-нибудь данные... и то в этом случае задержка между вызовом send и событием может составить около 10ти секунд.
Можно как-нибудь обойтись без отправки и ускорить процесс?
← →
DVM © (2007-05-21 21:20) [1]
> Можно как-нибудь обойтись без отправки и ускорить процесс?
Вот объясните мне, зачем надо обязательно знать, что соединение потеряно, если все равно ничего не передается?
← →
Nucer (2007-05-21 21:27) [2]Для того, чтобы восстановить соединение.
---
Клиент соединяется с сервером, редко шлет какую-либо информацию, в основном получает ее. Но, сервер может и не слать ничего на протяжении пят минут, а потом отправить один пакет. Так вот если соединение разорвано, то клиент быстро соединяется заново. Но проблема в том, что в определенных случаях событие Disconnect возникает с очень большой задержкой.
← →
Сергей М. © (2007-05-22 08:14) [3]
> в определенных случаях событие Disconnect возникает с очень
> большой задержкой
Рассказывай подробно про эти "определенные случаи" ..
← →
Nucer (2007-05-22 09:08) [4]>Рассказывай подробно про эти "определенные случаи"...
К примеру, если я перезагружу свой роутер... в таком случае программа вообще не определит, что соединение разорвано пока не будет принята попытка передать данные.
← →
Сергей М. © (2007-05-22 09:16) [5]
> Nucer (22.05.07 09:08) [4]
Т.е. ты утверждаешь, что в данной конкретной ситуации событие OnDisconnect возникнет намного позже успешного (??) вызова Send-метода, так ?
Не верю.
← →
Nucer (2007-05-22 09:29) [6]Нет, в данной ситуации я имел ввиду, что без вызова send события OnDisconnect можно ждать очень долго. А что делать, если мне не надо ничего передавать, а только принимать?
← →
Сергей М. © (2007-05-22 09:38) [7]
> что делать, если мне не надо ничего передавать, а только
> принимать?
Заведи таймер, в его обработчике делай тоже самое что и в обработчике OnRead. Успешный вызов read-метода означает, что соединение "живое", неуспешный - "мертвое".
← →
SpellCaster (2007-05-22 14:46) [8]"Пингуй" сервак тестовыми пакетами каждые 5 сек, например
← →
Nucer (2007-05-22 15:08) [9]
> Заведи таймер, в его обработчике делай тоже самое что и
> в обработчике 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 секунд... пусть и один байт... наверняка есть другой выход.
← →
DVM © (2007-05-22 15:25) [10]
> Не хотелось бы слать мусор каждые 5 секунд... пусть и один
> байт... наверняка есть другой выход.
нету.
← →
Nucer (2007-05-22 15:29) [11]А что-нибудь типа KeepAlive запроса =)
← →
Сергей М. © (2007-05-22 15:33) [12]
> наверняка есть другой выход
Других выходов нет и не будет.
> Делал так:
> recv(
С какого перепугу ты взялся за WinsockAPI ?
И если взялся, то где анализ результата. возвращаемого этой функцией ?
> И так:
> cs.Socket.Read
> Никакой реакции
Какую реакцию ты ожидал ?
Ты справку к методу TCustomWinSocket.Read читал, прежде чем ожидать какую-то конкретную реакцию ?
← →
SpellCaster (2007-05-23 13:17) [13]> [11] Nucer (22.05.07 15:29)
Это то же самое, что в [8]
← →
Сергей М. © (2007-05-23 13:44) [14]
> Nucer (22.05.07 15:29) [11]
>
> А что-нибудь типа KeepAlive запроса =)
Сначала научи сервер понимать такие запросы, тогда его можно и задействовать.
Страницы: 1 вся ветка
Текущий архив: 2008.02.03;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.047 c