2012-06-19 3 views
2

Отключено ли событие, когда idHttpServer отключается?Событие OnDisconnect на idHttpServer

Отключить Я не имею в виду, когда клиент отключается, но когда idHTTPServer отключается по какой-либо причине.

Я могу объяснить это лучше: когда idHTTPServer слушает порт сокета и по какой-то неизвестной причине компьютер отключается от сети (скажем, например, что сеть становится недоступной), компонент не работает (перестает слушать порт), и в этом случае мне нужно снова подключиться (снова открыть порт). idHttpServer.OnDisconnect, в соответствии с помощью, запускается только при отключении клиента с сервера.

+0

Я бы сказал [ 'OnListenException'] (http://www.indyproject.org/docsite/ html/TIdCustomTCPServer_OnListenException.html) - это то, что вам нужно, но это всего лишь предположение. – TLama

+0

@TLama: Я так не думаю. Согласно справке: OnListenException сигнализируется контекстом сервера в потоке слушателя, когда при выполнении конкретного потока прослушивателя возникает исключение, отличное от EAbort. –

+0

'EAbort' используется внутри, если прослушивающий сокет закрыт в ожидании нового клиентского соединения или превышен« MaxConnections »сервера. Любая другая ошибка в потоке прослушивания запускает событие OnListenException. Однако потеря сетевого соединения не гарантирует ошибку в прослушивающем сокете, поскольку прослушивание - это операция на локальном компьютере, а не в сети. За исключением того, что сетевой адаптер прослушивается при отключении, мало шансов получить сообщение от прослушивающего сокета. –

ответ

2

У меня есть два предложения, которые помогут вам решить вашу проблему.

Прежде всего, добавьте таймер, где раз в минуту (или интервал по вашему выбору), «спросите» окна, если ваш порт все еще прослушивает или нет. Это должно быть сделано за пределами Indy, так как Indy не имеет механизма для этого. Если Windows сообщит, что этот порт не прослушивается, запишите его в журнал и перезапустите сервер. Периодически проверяйте этот журнал, чтобы узнать, когда ваше приложение когда-либо сообщало о том, что ваш порт перестает слушать. Это скажет вам, действительно ли оно отключается или нет.

Во-вторых, вы можете рассмотреть возможность ночного перезапуска серверного сокета. Например, в полночь каждую ночь, остановите и запустите серверный сокет, чтобы обеспечить новое соединение. Возможно, существует некоторое переполнение переменных, например, если вы постоянно увеличиваете число, и оно становится все больше и больше, то со временем это число станет слишком большим для вашего приложения, чтобы его удерживать. Это может произойти где угодно между 5 секундами или 5 месяцами времени выполнения, в зависимости от того, насколько быстро вы его увеличиваете.

3

Вы можете подумать о создании сторожевого соединения с вашим сервером из-за его самостоятельного соединения с интервалом, когда вам не удалось подключиться, вы перезапустите сервер или что-то еще, что вам нужно, чтобы исправить проблему.

У этого есть дополнительный бонус, который вы фактически проверяете на подключении к серверу, поэтому, если возникнет какая-либо другая проблема, которая может вызвать соединение с клиентами, к ним будут подключены.

Это также может быть сделано отдельное приложение, которое имеет возможность закрыть, убить и перезагрузки У сервера

+0

Я работаю над этим. Благодарю. –

+0

Не могу поверить, что я не думал об этом, достаточно просто: D –