Как вы обрабатываете исключения при использовании TServerSocket в режиме блокировки?

Я пишу приложение на C ++ с использованием Embarcadero RAD studio и TServerSocket компонент в режиме блокировки. Я переопределил OnGetThread обработчик для сокета для создания пользовательского класса, производного от TServerClientThread который отменяет значение по умолчанию ClientExecute() метод. В рамках этой функции я использую TWinSocketStream и звонить WaitForData(), Read(), а также Write() получать и отправлять данные. Судя по всему, что я прочитал, это приемлемый способ решения проблем (хотя, пожалуйста, исправьте меня, если это не так).

Из этого ответа Какие события запускаются для блокирующего сокета? Я склонен полагать, что с помощью OnClientError обработчик в режиме блокировки в порядке, так как события будут срабатывать. В моем обработчике событий я каждый раз устанавливаю код ошибки на ноль, чтобы исключение не генерировалось.

Кроме того, каждый раз, когда я звоню Read() или же Write() изнутри моего ClientExecute() Функция я обернуть его в блок try-catch и поймать ESocketError исключения.

Мой вопрос таков: какой подход лучше?

  1. Используйте обработчик событий ошибки сокета, чтобы справиться со всем (это хорошо, так как я могу получить код ошибки сокета для отображения в целях отладки)
  2. Используйте операторы try-catch, чтобы мое приложение не выдавало исключения
  3. Используйте оба (хотя не устанавливайте код ошибки в ноль в обработчике, иначе исключение будет не быть брошенным, делая 2. выше бессмысленно)

Это старый компонент, и он устарел, но я должен его использовать, но так как я не смог найти руководство по правильному использованию чугуна, я собрал воедино подход из многих источников. Это работало хорошо в течение достаточно долгого времени, но время от времени я получаю тихую ошибку, которая не позволяет серверу принимать любые дальнейшие клиентские подключения — но я не получаю вывод от OnClientError и нет ESocketErrors брошены. Это приложение работает на встроенном устройстве, поэтому его можно обнаружить только в том случае, если оно перестает отвечать на запросы.

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

1

Решение

Если TServerSocket больше не принимает новые соединения, то либо его внутренние TServerAcceptThread нить разбилась так TServerWinSocket.Accept() больше не вызывается или Accept() вызывается, но сталкивается с ошибками ОС (нехватка системных ресурсов и т. д.). В любом случае, TServerSocket не раскрывает какую-либо информацию об ошибках из этих конкретных областей своего кода, поэтому у вас нет возможности обнаруживать и обрабатывать, когда ваш сервер прекращает принимать соединения, если ваши соединения не достаточно часты, чтобы вы могли использовать таймер для обнаружения длительных периодов бездействия между OnClientConnect События. Если вы подозреваете, что ваш сервер перешел в непринятое состояние, все, что вы можете сделать, это закрыть приложение и снова открыть TServerSocket,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]