Как вы обрабатываете исключения при использовании TServerSocket в режиме блокировки?
Я пишу приложение на C++ с использованием Embarcadero RAD studio и TServerSocket
компонент в режиме блокировки. Я переопределил OnGetThread
обработчик для сокета для создания пользовательского класса, производного от TServerClientThread
который отменяет значение по умолчанию ClientExecute()
метод. В рамках этой функции я использую TWinSocketStream
и звонить WaitForData()
, Read()
, а также Write()
получать и отправлять данные. В соответствии со всем, что я прочитал, это приемлемый способ решения проблем (хотя, пожалуйста, исправьте меня, если это не так).
Из этого ответа Какие события вызываются для сокета блокировки? Я склонен полагать, что с помощью OnClientError
обработчик в режиме блокировки в порядке, так как события будут срабатывать. В моем обработчике событий я каждый раз устанавливаю код ошибки на ноль, чтобы исключение не генерировалось.
Кроме того, каждый раз, когда я звоню Read()
или же Write()
изнутри моего ClientExecute()
Функция я обернуть его в блок try-catch и поймать ESocketError
исключения.
Мой вопрос таков: какой подход лучше?
- Используйте обработчик событий ошибки сокета, чтобы справиться со всем (это хорошо, так как я могу получить код ошибки сокета для отображения в целях отладки)
- Используйте операторы try-catch, чтобы мое приложение не выдавало исключения
- Используйте оба (хотя не устанавливайте код ошибки в ноль в обработчике, иначе исключение не будет выдано, делая 2. выше бессмысленным)
Это старый компонент, и он устарел, но я должен его использовать, но так как я не смог найти руководство по правильному использованию чугуна, я собрал воедино подход из многих источников. Это работало хорошо в течение довольно долгого времени, но время от времени я получаю тихую ошибку, которая не позволяет серверу принимать любые дальнейшие клиентские подключения - но я не получаю вывод от OnClientError
и нет ESocketErrors
брошены. Это приложение работает на встроенном устройстве, поэтому его можно обнаружить только в том случае, если оно перестает отвечать на запросы.
Если бы кто-нибудь мог дать мне совет, какой из трех подходов выше (или предложить альтернативу), я был бы очень благодарен.
1 ответ
Если TServerSocket
больше не принимает новые соединения, то либо его внутренние TServerAcceptThread
нить разбилась так TServerWinSocket.Accept()
больше не вызывается, иначе Accept()
вызывается, но сталкивается с ошибками ОС (нехватка системных ресурсов и т. д.). В любом случае, TServerSocket
не раскрывает какую-либо информацию об ошибках из этих конкретных областей своего кода, поэтому у вас нет возможности обнаруживать и обрабатывать, когда ваш сервер прекращает принимать соединения, если ваши соединения не достаточно часты, чтобы вы могли использовать таймер для обнаружения длительных периодов бездействия между OnClientConnect
События. Если вы подозреваете, что ваш сервер перешел в непринятое состояние, все, что вы можете сделать, это закрыть приложение и снова открыть TServerSocket
,